说我有2017年。
然后我有一个日期范围,01/07/2017
-01-07-2018
OR 01/07/2017
-01-01-2017
OR {{ 1}}-01/01/2016
(<-这应该返回365天)
我现在需要计算给定01/01/2018
的给定total days
中有多少range
。
请注意,日期存储为dd / mm / yyyy,且始终为00:00:00。
考虑范围的所有可能情况时,最佳逻辑是什么?
答案 0 :(得分:8)
您可以轻松计算一年的开始日期和结束日期:
var start2017 = new DateTime(2017,1,1);
var end2017 = new DateTime(2017,12,31);
然后您可以计算此新范围与其他范围 1 之间的重叠:
var startOverlap = start2017 < startOtherRange ? startOtherRange : start2017;
var endOverlap = end2017 > endOtherRange ? endOtherRange : end2017;
var totalDays = (endOverlap - startOverlap).TotalDays + 1;
如果范围意在包括其开始日期和结束日期,则上述说明是正确的。例如,如果您要使用排他性终点,则我们将对2017年计算范围的末尾进行进一步调整,并且不再需要在末尾进行+1
调整
(我想您可以从那里获得如何将其变成一个函数,该函数需要使用year, startRange, endRange
参数并通过适当的重命名来执行上述操作)
1 我对DateTime.Min(value1, value2)
有一些模糊的回忆,对Max
也有类似的回忆,但是我绝对不能在BCL中看到它。这些将替换以下行中的条件运算符。一旦C#“扩展了所有内容”,这些功能就可以作为对DateTime
的静态扩展来编写。