编写一个小应用程序来计算利息,但利率每年都会变化。当跨越年份边界时,需要将范围分解为更小的日期范围。我写了一些 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/