C# 为不同日历获取一年中某一天的更好方法
我正在尝试获取以下日历的月份日期: 我编写了两个不同的函数来实现这一点:C# 为不同日历获取一年中某一天的更好方法,c#,calendar,C#,Calendar,我正在尝试获取以下日历的月份日期: 我编写了两个不同的函数来实现这一点: public int DayOfYear(int year, int month, int day) { var months = new[] {31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 31}; var dayOfYear = day; if (month == 1) return dayOfYear; for (var i = 0;
public int DayOfYear(int year, int month, int day)
{
var months = new[] {31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 31};
var dayOfYear = day;
if (month == 1) return dayOfYear;
for (var i = 0; i < month-1; i++)
{
dayOfYear += months[i];
}
return dayOfYear;
}
public int-DayOfYear(int-year,int-month,int-day)
{
var月数=新[]{31,31,31,31,30,30,30,30,30,31};
var dayOfYear=天;
如果(月==1)返回年中的日期;
对于(变量i=0;i<1个月;i++)
{
dayOfYear+=月[i];
}
每年的返回日;
}
要做到这一点,无需循环:
public int DayOfYear(int year, int month, int day)
{
var dayOfYear = day;
if (month <= 5)
dayOfYear += 31 * (month-1);
else
dayOfYear += 31 * 5 + 30 * ((month - 5) - 2);
if (month == 12)
dayOfYear += 31;
return dayOfYear;
}
public int-DayOfYear(int-year,int-month,int-day)
{
var dayOfYear=天;
如果(月创建一个月的字典=>到该点为止的总天数
private static readonly Dictionary TotalDays=新字典
{
[1] = 0,
[2] = 31,
[3] = 62,
[4] = 93,
//等
};
//用于月日验证
私有静态只读字典DaysPerMonth=新字典
{
[1] = 31,
[2] = 31,
[3] = 31,
[4] = 31,
//等
};
然后根据截至该点的天数加上本月的天数计算一年中的日期:
public int-DayOfYear(int-year,int-month,int-day)
{
//验证您的参数
如果(!TotalDays.TryGetValue(月,超出var总计))
抛出新异常(“无效月份”);
如果(日/日/月[月])
抛出新异常(“天太大或太小”);
返回总数+天;
}
单线解决方案:
public int DayOfYear(int year, int month, int day) =>
31 * (month - 1) - Math.Max(0, month - 6) + day;
它只是假设在第一个月之前每个月有31天。所以31*(第1个月),但因为第6个月是30天,所以我们减去Math.Max(0,第6个月),然后简单地加上几天
它也适用于闰年,但只适用于有效日期。@Charlieface这对我的问题“我想要一年中的哪一天”有效吗?我的月日显然不同于公历。这是一个好方法,我也考虑过这样做。但由于与公历不同,公历重复了相同的周一连续几个月的时间。我想我们可以不用字典来做这个数学数学。@OS虽然可能是这样,但上面的内容可能更清楚。阅读您的代码的其他人(甚至您未来的自己)可能看不到数学解,使其难以推理和阅读。请记住,您只编写了一次代码,但却阅读了多次。如果我看到这样的解决方案,包括您在PR/代码审查中的第二个示例,我绝对不会接受。这不是我们可以使用注释的原因吗?为了帮助我们更好地理解代码?日历计算往往是数学性质的。