给定日期范围(开始日期和结束日期),我如何计算天数,不包括 .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 中指定的星期几?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算给定日期的剩余天数、小时数、分钟数和秒数?

如何使用 Moment JS 计算范围之间的给定工作日数?

js 怎么计算 开始日期(2011-02-22)+天数(3)=结束日期(2011-02-24)

计算每年开始和结束日期之间的天数

计算员工在开始和结束日期之间应报告工作的天数

日期范围内给定年份的天数