c# - 按年份计算日期范围

标签 c#

编写一个小应用程序来计算利息,但利率每年都会变化。当跨越年份边界时,需要将范围分解为更小的日期范围。我写了一些 for 循环 来做到这一点,但它相当笨重。想知道 C# 中是否有任何内置函数可以执行此操作(可能是 linq)。基本上会希望返回具有相应基准年的日期范围列表(为了可读性而缩短代码)。

    static void Main(string[] args)
    {

        var dateStart = DateTime.Parse("2/10/2018");
        var dateEnd = DateTime.Parse("3/10/2021");

        var years = Years(dateStart, dateEnd);

        var baseYear = dateStart.Year;
        Console.WriteLine(baseYear);

        var loopDateStart = dateStart;
        var loopDateEnd = DateTime.Now;

        for (int i = 0; i < years + 1; i++)
        {
            if (i < years) {
                loopDateEnd = DateTime.Parse("1/1/" + (baseYear + 1));
                
                Console.WriteLine(loopDateEnd + " ... " + loopDateStart);
                Console.WriteLine((loopDateEnd - loopDateStart).Days);

                loopDateStart = loopDateEnd;
                baseYear++; 
            }
            else {
                
                loopDateEnd = dateEnd;
                
                Console.WriteLine(loopDateEnd + " ... " + loopDateStart);
                Console.WriteLine((loopDateEnd - loopDateStart).Days);
            }
        }
    }

    public static int Years(DateTime start, DateTime end)
    {
        return (end.Year - start.Year - 1) +
            (((end.Month > start.Month) ||
            ((end.Month == start.Month) && (end.Day >= start.Day))) ? 1 : 0);
    }

最佳答案

当然,我们可以使用 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 制作一个年份列表:2018,2019,2020,2021,从 2108 开始,持续 4 年(2018 到 2018 是一年条目,2018到 2021 年为 4 年条目)

然后我们使用new DateTime(year,amonth,aday)将它们转换为日期 - 当我们制作开始日期时,amonth和aday是1和1,当制作结束日期时它们是12和 31

然后我们只要求每年 y,“哪个日期较大,开始日期或 1-Jan-y”和“哪个日期较小,结束日期或 31-Dec-y "- 对于初始日期和最终日期条目,它是开始日期和结束日期的较大和较小值。对于其他年份,则是一月/十二月日期。这给出了您想要的范围

    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

如果您想做其他工作,例如之间的天数,您可以在循环中执行xx.T-xx.F,以创建时间跨度等

关于c# - 按年份计算日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67013196/

相关文章:

c# - 强制从派生类外部调用基方法

C# rijndael CryptoStream 我可以像 textwriter 那样写入文件吗?

c# - Nservicebus 多端点错误

c# - Selenium 与 UWP 应用程序?

c# - 重构多层if-then

c# - 如何使用 QuickGraph 查找两个顶点之间的所有路径

c# - 如何在 .Net Core 的 AuthorizeAttribute 类中访问 appsetting.json 参数

c# - Application.ThreadException 与 AppDomain.UnhandledException

c# - 包装我们的软件库以服务于 C++ 和 C# 客户端应用程序的最佳方式是什么?

c# - 如何优化 ASP.NET MVC Controller 以最小化数据库查询次数