一年中的一周 C# 日期时间

本文关键字:一周 日期 时间 一年 | 更新日期: 2023-09-27 18:30:55

我有以下代码来获取日期时间对象中给定的年份的周数

    public static int WeeksInYear(DateTime date)
    {
        GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
        return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }

我给函数的日期为 1/1/2012,它应该返回第 1 周,但它返回第 52 周。我似乎想不通为什么。有人知道为什么吗?

一年中的一周 C# 日期时间

该算法正在执行您指示它执行的操作。您已将 CalanderWeekRule 设置为 FirstFourDayWeek。2012 年 1 月 1 日不是前四天周的一部分,因此您已指示日历从 1 月 2 日开始计数。

根据周数计算日期

public static int WeeksInYear(DateTime date)
{
    GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
    return cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

我认为如果将CalendarWeekRule.FirstFourDayWeek更改为CalendarWeekRule.FirstDay,那么这将正常工作。

我改变了这个,然后它工作正常。

周数计算正确。您应该了解周数的实际计算/计数方式(维基百科?!

注意:周数计算的内置计算有问题。Microsoft知识库文章200299中描述了该问题。它在ISO-8601方面存在问题。

可以使用支持

ISO 8601 周编号的 .NET 时间段库的周:

TimeCalendar calendar = new TimeCalendar(
    new TimeCalendarConfig { YearWeekType = YearWeekType.Iso8601 } );
Week week = new Week( new DateTime( 2012, 01, 01 ), calendar );
Console.WriteLine( "week #: ", week.WeekOfYear );

我假设因为 1/1/2012 是星期日,GetWeekOfYear说它返回包含日期的一周,它返回的是 2011 年的最后一周而不是 2012 年的第一周。

请查看日历规则进行澄清。

1/1/2012 那天是星期天。我相信这就是为什么你会得到52,因为这是去年一周的最后一天。对于1月2日,您应该获得正确的结果。