Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从较大的时间跨度中减去不同年份的时间跨度_C#_Asp.net_Algorithm_Math - Fatal编程技术网

C# 从较大的时间跨度中减去不同年份的时间跨度

C# 从较大的时间跨度中减去不同年份的时间跨度,c#,asp.net,algorithm,math,C#,Asp.net,Algorithm,Math,我使用的语言是C# 我有下面的难题 DateTime A,DateTime B。如果A

我使用的语言是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循环中计算出详细信息。

谢谢,这是一个有趣的解决方案。不过,如果此操作执行得太频繁,可能会变得非常昂贵。特别是对于较长的时间跨度,因为它会随着您的反复而重新计算天数。