【问题标题】:TimeSpan for different years subtracted from a bigger TimeSpan从更大的 TimeSpan 中减去不同年份的 TimeSpan
【发布时间】:2011-06-23 23:44:17
【问题描述】:

我使用的语言是 C#。

我有以下困境。

DateTime A,DateTime B。如果 A

例如:

2009 年 TimeSpan 中的天数 * 2009 年的 coef + 2010 年 TimeSpan 中的天数 * 2010 年 + 的 coef 等

【问题讨论】:

    标签: c# asp.net algorithm math


    【解决方案1】:

    基本上,你不能用简单的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 天。 (顺便说一句,我假设您只使用公历。如果没有,所有这些都会改变!)

    【讨论】:

      【解决方案2】:

      这里有一些可能有帮助的小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                    
                  };
      

      【讨论】:

      • 谢谢,有趣的解决方案。
      【解决方案3】:

      如果我正确理解了您的问题,最好使用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 循环中计算出的详细信息。

      【讨论】:

      • 尽管如此,如果此操作执行得太频繁,它可能会变得相当昂贵。特别是对于较长的时间跨度,因为它会在您一遍又一遍地重新计算天数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      相关资源
      最近更新 更多