C# 从较大的时间跨度中减去不同年份的时间跨度
我使用的语言是C# 我有下面的难题 DateTime A,DateTime B。如果A 例如:C# 从较大的时间跨度中减去不同年份的时间跨度,c#,asp.net,algorithm,math,C#,Asp.net,Algorithm,Math,我使用的语言是C# 我有下面的难题 DateTime A,DateTime B。如果A
2009年的时间跨度天数*2009年的coef+2010年的时间跨度天数*2010年的coef+etc基本上,你不能用一个简单的
时间跨度来实现这一点。它不知道什么时候跨度会覆盖——它只是一些滴答声,真的
在我看来,有两种情况需要考虑:
- A和B在同一年。这很简单-只需从另一个中减去一个,然后从中得到天数
- A和B在不同的年份。现在有两到三种情况:
- 一年中A之后的天数。你可以通过构造次年的1月1日,然后减去
- 每年完全介于A和B之间的天数(因此,如果A在2008年,B在2011年,这将是2009年和2010年)
- B年中的天数。你可以通过构造上一年的12月31日,然后减去B(或者可能是B年的1月1日,这取决于你是否想计算B的日期)
您可以使用DateTime.IsLeapYear
确定任何特定年份中的天数是365天还是366天。(顺便说一句,我假设您只使用公历。如果没有,所有这些都会改变!)这里有一段代码可能会有所帮助
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
};
如果我对你的问题理解正确,用英语解决它将是最好的
比如说,如果您的开始日期是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计算间隔中的日期数(总天数加上一天)
没有必要专门处理闰年或计算12月31日。
您可以在跨度内每年1月1日的for循环中计算出详细信息。谢谢,这是一个有趣的解决方案。不过,如果此操作执行得太频繁,可能会变得非常昂贵。特别是对于较长的时间跨度,因为它会随着您的反复而重新计算天数。