【发布时间】:2011-06-23 23:44:17
【问题描述】:
我使用的语言是 C#。
我有以下困境。
DateTime A,DateTime B。如果 A
例如:
2009 年 TimeSpan 中的天数 * 2009 年的 coef + 2010 年 TimeSpan 中的天数 * 2010 年 + 的 coef 等
【问题讨论】:
我使用的语言是 C#。
我有以下困境。
DateTime A,DateTime B。如果 A
例如:
2009 年 TimeSpan 中的天数 * 2009 年的 coef + 2010 年 TimeSpan 中的天数 * 2010 年 + 的 coef 等
【问题讨论】:
基本上,你不能用简单的TimeSpan 做到这一点。它对 何时 跨度覆盖一无所知 - 它只是一些滴答声,真的。
在我看来,您需要考虑两种情况:
您可以使用DateTime.IsLeapYear 来确定任何特定年份是有 365 天还是 366 天。 (顺便说一句,我假设您只使用公历。如果没有,所有这些都会改变!)
【讨论】:
这里有一些可能有帮助的小sn-p代码
var start = new DateTime(2009, 10, 12);
var end = new DateTime(2014, 12, 25);
var s = from j in Enumerable.Range(start.Year, end.Year + 1 - start.Year)
let _start = start.Year == j ? start : new DateTime(j, 1, 1)
let _end = end.Year == j ? end : new DateTime(j, 12, 31)
select new {
year = j,
days = Convert.ToInt32((_end - _start).TotalDays) + 1
};
【讨论】:
如果我正确理解了您的问题,最好使用Inclusion Exclusion principle 解决它。
假设你的开始日期是 2008 年,而结束日期是 2010 年:
NDAYS(start, end) * coeff_2008
- NDAYS(2009, end) * coeff_2008 + NDAYS(2009, end) * coeff_2009
- NDAYS(2010, end) * coeff_2009 + NDAYS(2010, end) * coeff_2010
其中 Ndays 计算间隔中的日期数(TotalDays 加上一天)。
无需专门处理闰年或计算 12 月 31 日。 您可以在跨度中每年 1 月的第一个 for 循环中计算出的详细信息。
【讨论】: