我使用的语言是C#。
我有下面的dillema。
DateTime A,DateTime B.如果A< B然后我必须计算该时间跨度内每年的天数,并乘以与该年相对应的系数。 我的问题是它可以跨越多年。
例如:
2009年TimeSpan中的Nr天数* 2009年的Timefan + 2010年的时间天数* 2010年的系数+等等
答案 0 :(得分:6)
基本上,你不能用一个简单的TimeSpan
做到这一点。当跨度覆盖时,它对一无所知 - 它只是一些滴答,真的。
听起来我觉得有两种情况需要考虑:
您可以使用DateTime.IsLeapYear
来确定任何特定年份是否有365或366天。 (我假设你只使用公历,顺便说一下。如果没有,所有这些都会改变!)
答案 1 :(得分:3)
以下是一些可能有用的代码片段
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
};
答案 2 :(得分:2)
如果我理解您的问题,使用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日。 你可以在每年的第一年中逐步完成for循环的细节。