我正在计算日期的周数,但System.Globalization.Calendar正在返回2007年12月31日和2012年12月31日的奇怪结果。
Calendar calendar = CultureInfo.InvariantCulture.Calendar;
var date = new DateTime(2007, 12, 29);
for (int i = 0; i < 5; i++)
{
int w = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Console.WriteLine("{0}\t{1}", date.ToString("dd.MM.yyyy"), w);
date = date.AddDays(1);
}结果
29.12.2007 52
30.12.2007 52
31.12.2007 53 <--
01.01.2008 1
02.01.2008 1
29.12.2012 52
30.12.2012 52
31.12.2012 53 <--
01.01.2013 1
02.01.2013 1据我所知,2007年和2012年不应该有53周,但第一周应该包括这几天。有没有办法改变Calendar的这种行为?
发布于 2012-01-10 19:22:24
CalendarWeekRule枚举的文档明确指出,它“不直接映射到ISO8601”,并链接到采用Microsoft .Net的ISO 8601周年度格式,这是一个描述差异的博客条目。
发布于 2012-01-10 19:12:33
看看CalendarWeekRule的值。您正在使用FirstFourDayWeek,因此您将得到所描述的值。如果你想每周都有7天,你应该使用FirstFullWeek。
就你而言,这意味着31。12. 2007年将是第53周,但2008年2月1日也是如此。
发布于 2020-02-06 15:17:56
从.net核心3开始,有一个新的ISOWeek,它确实正确地计算了WeekOfYear
https://learn.microsoft.com/en-us/dotnet/api/system.globalization.isoweek.getweekofyear
https://stackoverflow.com/questions/8808878
复制相似问题