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

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/代码审查中的第二个示例,我绝对不会接受。这不是我们可以使用注释的原因吗?为了帮助我们更好地理解代码?日历计算往往是数学性质的。