年份C#date时间周

我有以下代码来获取在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日你应该得到正确的结果。