给定日期范围(开始和结束日期),如何计算.Net中不包括一周中指定天数的天数?

时间:2020-03-06 14:42:50  来源:igfitidea点击:

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

日期范围控件是" DateTimePickers",而星期几是"复选框"。

这是UI的模型:

从日期:(dtpDateFrom)
截止日期:(dtpDateTo)

`[y]星期一,[n]星期二,[y]星期三,等等。

最好不仅以日期范围为基础,还以星期几(或者选定的天数)为基础来显示总天数的最佳方法是什么?

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

解决方案

遍历并不是我们唯一的选择,我们可以执行减法运算以计算出总天数,并为包含这些天之一的每周"跳过"日期减去每个天数。当我们确定一天是落在范围开头还是结尾的部分星期之一中并添加`#weeks *一周中的跳过天数"时,代码将比仅计算时更加复杂,但是如果我们希望日期范围较大,则它的效果可能会更好。

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

这是我的处理方法:

  • 查找第一个和最后一个日期的星期几(日期)
  • 将第一天移至与上一个相同的日头。商店要包括的移动天数
  • 计算第一个和最后一个之间的周数
  • 计算一周中包含的天数*周数+移动的包含天数

作为伪代码:

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进行此类操作。