我有以下代码来获取在DateTime对象时间中给出的一年的周数
public static int WeeksInYear(DateTime date) { GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized); return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); }
现在我给function的date2012年1月1日,应该返回第一周,但他回来了52周。我似乎无法弄清楚为什么。 任何人有一个想法为什么?
该算法正在执行您指示的操作。 您将CalanderWeekRule设置为FirstFourDayWeek。 2012年1月1日不是头四周的一部分,所以你已经指示ca子从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在KnowledgeBase-Article 200299中描述了这个问题。 ISO-8601有问题。
您可以使用支持ISO 8601星期编号的.NET类时间库类Week :
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年1月1日是一个星期天, GetWeekOfYear
表示它将返回包含该日期的一周,它将返回2011年的最后一周,而不是2012年的第一周。
看看CalendarRule澄清。
2012年1月1日,这是星期天。 我相信这就是为什么你得到52,因为这是去年一周的最后一天。 1月2日你应该得到正确的结果。