【问题标题】:Given a date range (start and end dates), how can I count the days, excluding specified days of the week in .Net?给定日期范围(开始日期和结束日期),我如何计算天数,不包括 .Net 中指定的星期几?
【发布时间】:2008-09-25 10:29:11
【问题描述】:

我正在创建一个 UI,允许用户选择日期范围,并勾选或取消勾选日期范围内适用的星期几。

日期范围控件为DateTimePickers,星期几为CheckBoxes

这是一个 UI 模型:

From Date: (dtpDateFrom)
To Date: (dtpDateTo)

[y] Monday, [n] Tuesday, [y] Wednesday, (etc)

显示总天数的最佳方式是什么,不仅基于日期范围,还基于选中(或选定)的一周中的几天?

循环浏览日期范围是我唯一的选择吗?

【问题讨论】:

    标签: .net date


    【解决方案1】:

    以下是我的处理方式:

    • 查找第一个和最后一个日期的星期几(dow)
    • 将第一天向前移动到与最后一天相同的道琼斯指数。要包含的商店搬迁天数
    • 计算第一个和最后一个之间的周数
    • 计算一周中包含的天数 * 周数 + 包含的移动天数

    作为伪代码:

     moved = start + end_dow - start_dow
     extras = count included days between start and moved
     weeks = ( end - moved ) / 7
     days = days_of_week_included * weeks + extras
    

    无论开始日期和结束日期相距多远,这将花费恒定的时间。

    实现此算法的细节取决于您使用的语言和库。在可能的情况下,我使用 C++ 和 boost::date_time 来处理这类事情。

    【讨论】:

      【解决方案2】:

      循环不是您唯一的选择 - 您可以执行 subtraction 来计算总天数,并为包含这些天之一的每周范围内的每个“跳过”日期减去一个.当您确定某一天是否落在范围开始或结束的部分周之一并添加 #weeks * skipped days in a week 时,您的代码将比仅计算时更复杂,但如果您期待拥有巨大的日期范围,它可能会表现得更好。

      如果我是你,我会编写简单的循环选项,如果发现分析表明它是一个瓶颈,我会重写它。

      【讨论】:

      • 我想我会听从你的建议,先做简单的循环选项,然后我可能会尝试 ravenspoint 的算法:o)
      • 以下是简单循环选项的一些时间安排:1/1/0001 - 31/Dec/2000:计算 [730453] 天 [00:00:02.1875000],1/1/0001 - 9999 年 12 月 31 日:[3651662] 天花了 [00:00:11.2812500]。结论?简单的循环在我的目标硬件上足够快:o)
      • “00:00:02.1875000”有多长。这是否意味着超过2秒?如果是这样,那对我来说似乎太慢了。
      • 正确 - 大约 2000 年中的每一天仅超过 2 秒
      猜你喜欢
      • 2016-10-19
      • 1970-01-01
      • 2019-07-06
      • 2020-12-23
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多