18

日付の週数を計算している最中ですが、System.Globalization.Calendar2007年と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週目はないはずですが、その日数は1週目に含める必要があります。この動作を変更する方法はありCalendarますか?

4

4 に答える 4

16

CalendarWeekRule 列挙型のドキュメントには、 「ISO 8601 に直接マッピングされていない」と明確に記載されており、Microsoft .Net の ISO 8601 年の週の形式へのリンクがあります。これは、違いを説明するブログ エントリです。

于 2012-01-10T19:22:24.677 に答える
2

の値を見てくださいCalendarWeekRule。を使用しFirstFourDayWeekているので、説明した値を取得しています。毎週正確に7日にしたい場合は、を使用する必要がありますFirstFullWeek

あなたの場合、それは31. 12. 2007が第53週になることを意味しますが、2。1.2008もそうなります。

于 2012-01-10T19:12:33.377 に答える
0

週の識別子を一意にするために 52 週である必要はありません。特定の週に必ずしも 7 日あるとは限りません。

これが問題になる場合は、エッジ ケースを処理するコードを追加します。

于 2012-01-10T19:05:36.887 に答える