给定日期范围(开始日期和结束日期),我如何计算天数,不包括 .Net 中指定的星期几?
Posted
技术标签:
【中文标题】给定日期范围(开始日期和结束日期),我如何计算天数,不包括 .Net 中指定的星期几?【英文标题】:Given a date range (start and end dates), how can I count the days, excluding specified days of the week in .Net? 【发布时间】:2008-09-25 10:29:11 【问题描述】:我正在创建一个 UI,允许用户选择日期范围,并勾选或取消勾选日期范围内适用的星期几。
日期范围控件为DateTimePickers
,星期几为CheckBoxes
这是一个 UI 模型:
From Date: (dtpDateFrom)
To Date: (dtpDateTo)
[y] Monday, [n] Tuesday, [y] Wednesday, (etc)
显示总天数的最佳方式是什么,不仅基于日期范围,还基于选中(或选定)的一周中的几天?
循环浏览日期范围是我唯一的选择吗?
【问题讨论】:
【参考方案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 秒以上是关于给定日期范围(开始日期和结束日期),我如何计算天数,不包括 .Net 中指定的星期几?的主要内容,如果未能解决你的问题,请参考以下文章