从更大的TimeSpan中减去TimeSpan不同年份

时间:2011-02-09 08:41:29

标签: c# asp.net algorithm math

我使用的语言是C#。

我有下面的dillema。

DateTime A,DateTime B.如果A< B然后我必须计算该时间跨度内每年的天数,并乘以与该年相对应的系数。 我的问题是它可以跨越多年。

例如:

2009年TimeSpan中的Nr天数* 2009年的Timefan + 2010年的时间天数* 2010年的系数+等等

3 个答案:

答案 0 :(得分:6)

基本上,你不能用一个简单的TimeSpan做到这一点。当跨度覆盖时,它对一无所知 - 它只是一些滴答,真的。

听起来我觉得有两种情况需要考虑:

  • A和B在同一年。这很简单 - 只需从另一个中减去一个并从中获取天数
  • A和B在不同的年份。现在有两三种情况:
    • A年份A之后的天数。您可以通过构建下一年的1月1日,然后减去A
    • 来解决这个问题
    • 每年完全在A和B之间的天数(如果A在2008年,B在2011年,那将是2009年和2010年)
    • B年的天数。您可以通过构建前一年的12月31日,然后减去B.(或者可能是B年的1月1日,取决于您是否要计算B开启的日期。)

您可以使用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循环的细节。