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

Posted

技术标签:

【中文标题】日期范围内给定年份的天数【英文标题】:Number of days for a given year inside a date range 【发布时间】:2018-08-09 12:30:09 【问题描述】:

假设我有一年,2017 年。

然后我有一个日期范围,01/07/2017 - 01-07-2018 OR 01/07/2017 - 01-01-2017 OR 01/01/2016 - 01/01/2018 (

我现在需要计算给定range 中给定year 中有多少total days

请注意,日期存储为 dd/mm/yyyy,时间始终为 00:00:00。

考虑所有可能的范围情况,最佳逻辑是什么?

【问题讨论】:

1.获取两端之间的天数 2. 如果第一个日期在该年之前开始,则减去差值。 3. 如果第二个日期在该年之后,则减去差异 请务必在您的测试用例中考虑 2 月 29 日。 我不太明白你的意思是什么:“01/01/2016 - 01/01/2018( 不是有2年的差距吗?您需要 2016 年和 2017 年的总天数还是只需要一年? 问题开头的数字 2017 给出了一个 隐式 范围,旨在涵盖该年的所有日子。有一个来自其他地方的 explicit 范围,其示例在第二段中。我们需要计算这些范围之间的 overlap 并找出 that 的长度。答案永远不会大于 366,因为其中一个范围是一年。 【参考方案1】:

您可以轻松计算一年的开始和结束日期:

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我对@9​​87654325@ 和Max 有一些模糊的回忆,但它绝对不在我能看到的BCL 中。这些将替换以下行中的条件运算符。一旦 C# 拥有“扩展一切”,这些函数就可以编写为 DateTime 的静态扩展。

【讨论】:

那是错误的结束日期。你实际上想要new DateTime(2018,1,1);,否则你会得到 364 天而不是 365 天,因为时间是最后一天的开始而不是结束。 @juharr 这一直是我的疑问。有人可以证实这一点吗? @juharr - 在进行调整之前,我们需要知道他们是否认为范围的开始和结束是包含性的还是排除性的。正确的更正可能只是最终结果上的+1 @Damien_The_Unbeliever 如果结束日期在一年的最后一天之后,我希望他们想要包括一整天。 @k1dev - 你的示例范围,比如01/07/2017 - 01-07-2018 是否包括 2017 年 7 月 1 日和 2017 年 7 月 1 日,仅包括其中一个,或者两者都不包括(以及两者之间的所有其他日子)。我们需要知道端点的含义。

以上是关于日期范围内给定年份的天数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 snowsql 在给定日期范围内构造日期数组?

统计日期范围内的天数

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

查找给定日期范围内的工作日/周末数

使用php计算日期范围内的天数?

第144章 SQL函数 TO_DATE(二)