11

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

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

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

4

6 回答 6

9

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

从周数计算日期

于 2012-04-11T08:51:26.380 回答
5
public static int WeeksInYear(DateTime date)
{
    GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized);
    return cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday);

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

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

于 2013-01-03T03:48:36.137 回答
1

您可以使用支持 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 );
于 2012-04-11T10:01:05.990 回答
1

周数计算正确。您应该阅读实际如何计算/计算周数(维基百科?!)。

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

于 2012-04-11T08:57:23.090 回答
0

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

请查看CalendarRule以进行澄清。

于 2012-04-11T08:52:01.407 回答
0

1/1/2012 it was sunday. I believe that's why you get 52, because it was last day of the last year week. For the 2nd of january you should get the right result.

于 2012-04-11T08:52:59.797 回答