Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# - Fatal编程技术网

C# 按年份以块计算日期范围

C# 按年份以块计算日期范围,c#,C#,编写一个小应用程序来计算利息,但利率每年都在变化。当跨越一年边界时,需要将日期范围划分为更小的日期范围。我为loop写了一点,但它相当笨重。想知道是否有任何内置函数可以在C#(可能是linq)中实现这一点。基本上,我们希望返回一个包含相应基准年的日期范围列表(为了可读性而缩短代码) static void Main(字符串[]args) { var dateStart=DateTime.Parse(“2/10/2018”); var dateEnd=DateTime.Parse(“3/10/20

编写一个小应用程序来计算利息,但利率每年都在变化。当跨越一年边界时,需要将日期范围划分为更小的日期范围。我为loop写了一点
,但它相当笨重。想知道是否有任何内置函数可以在C#(可能是linq)中实现这一点。基本上,我们希望返回一个包含相应基准年的日期范围列表(为了可读性而缩短代码)

static void Main(字符串[]args)
{
var dateStart=DateTime.Parse(“2/10/2018”);
var dateEnd=DateTime.Parse(“3/10/2021”);
var年=年(日期开始,日期结束);
var baseYear=dateStart.Year;
控制台写入线(基准年);
var loopDateStart=dateStart;
var loopDateEnd=DateTime.Now;
对于(int i=0;i月初)||
((end.Month==start.Month)和&(end.Day>=start.Day))?1:0);
}
试试:

var start=DateTime.Parse(“4/5/2017”);
var end=DateTime.Parse(“2019年3月1日”);
日期时间块结束;
对于(var chunkStart=start;chunkStartlastDay?lastDay:end;
var days=(chunkEnd-chunkStart).days;
WriteLine($“{chunkStart:d}-{chunkEnd:d};{days}days”);
}
产生:

4/5/2017 - 12/31/2017; 270 days 1/1/2018 - 12/31/2018; 364 days 1/1/2019 - 3/1/2019; 59 days 4/5/2017 - 12/31/2017; 270天 1/1/2018 - 12/31/2018; 364天 1/1/2019 - 3/1/2019; 59天
我得出了以下结论:

static IEnumerable<(DateTime,DateTime)> ChunkByYear(DateTime start, DateTime end)
{
    // Splits <start,end> into chunks each belonging to a different year
    while(start <= end)        
    {
        var tempEnd = new DateTime(start.Year, 12, 31);

        if(tempEnd >= end ) {
            yield return (start, end);
            yield break;
        }

        yield return (start, tempEnd);
        start = tempEnd.AddDays(1);
    }
}
按年份分组:

使用System.Collections.Generic;
使用System.Linq;
...
静态void Main(字符串[]参数)
{
DateTime dateStart=DateTime.Parse(“2/10/2018”);
DateTime dateEnd=DateTime.Parse(“3/10/2021”);
//按年份将所有可能的日期分组
foreach(GetDates(dateStart,dateEnd).GroupBy(date=>date.Year)中的var组)
{
Console.WriteLine(group.Key);//组的键为年
Console.WriteLine($“{group.Min()}…{group.Max()}”);//范围:从最小到最大,顺序无关紧要。
Console.WriteLine($“{group.First()}…{group.Last()}”);//或范围版本2:从第一个到最后一个,顺序很重要。
Console.WriteLine(group.Count());//计数天数
}
}
/// 
///盲目获得所有的日子,可能需要注意日子的界限
/// 
私有静态IEnumerable GetDates(日期时间开始,日期时间结束)
{
//TODO:选中开始当然,我们可以使用LINQ:

var x = Enumerable.Range(dateStart.Year, (dateEnd.Year-dateStart.Year)+1)
    .Select(y => new{
        F = new[]{dateStart, new DateTime(y,1,1)}.Max(),
        T = new[]{dateEnd, new DateTime(y,12,31)}.Min()
    });
它生成一个对象的可枚举列表,这些对象的F和T属性(from和to)是您的范围

它的工作原理是使用
Enumerable.Range
列出年份:2018201920202021,从2108开始,持续4年(2018年至2018年为一年,2018年至2021年为4年)

然后我们只需使用新的日期时间(年,阿蒙斯,阿迪)
将它们转换为日期-当我们制作开始日期时,阿蒙斯和阿迪是1和1,当制作结束日期时,它们是12和31

然后,我们只需询问每年的“开始日期或1月1日”和“结束日期或12月31日”这两个问题-对于初始和最终日期输入,开始日期和结束日期的大小不同。对于其他年份,是一月/十二月日期。这给出了您想要的范围

    foreach(var xx in x){
        Console.WriteLine(xx.F +" to "+xx.T);
    }

如果你想做其他的工作,比如间隔天数,你可以在循环中做
xx.T-xx.F
,做一个时间跨度等

建议你养成将日期编码为“yyyy-MM-dd”的习惯-明确无误then@caius贾德:谢谢你的提示
4/05/2017 to 3/01/2019:
 4/05/2017->31/12/2017
 1/01/2018->31/12/2018
 1/01/2019->3/01/2019

4/05/2017 to 4/05/2017:
 4/05/2017->4/05/2017

31/12/2017 to 31/12/2019:
 31/12/2017->31/12/2017
 1/01/2018->31/12/2018
 1/01/2019->31/12/2019

31/12/2019 to 31/12/2019:
 31/12/2019->31/12/2019

31/12/2018 to 1/01/2019:
31/12/2018->31/12/2018
1/01/2019->1/01/2019
var x = Enumerable.Range(dateStart.Year, (dateEnd.Year-dateStart.Year)+1)
    .Select(y => new{
        F = new[]{dateStart, new DateTime(y,1,1)}.Max(),
        T = new[]{dateEnd, new DateTime(y,12,31)}.Min()
    });
    foreach(var xx in x){
        Console.WriteLine(xx.F +" to "+xx.T);
    }
2/10/2018 12:00:00 AM to 12/31/2018 12:00:00 AM
1/1/2019 12:00:00 AM to 12/31/2019 12:00:00 AM
1/1/2020 12:00:00 AM to 12/31/2020 12:00:00 AM
1/1/2021 12:00:00 AM to 3/10/2021 12:00:00 AM