2012-01-10 18 views
12

私は日付の週番号を計算中ですが、System.Globalization.Calendarは(他の年の間に)2007年と2012年の12月31日に奇妙な結果を返しています。System.Globalization.Calendar.GetWeekOfYear()は奇妙な結果を返します

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に含まれるべき方法はあります0123でこの動作を変更する?

+2

「1日目には日数が含まれているはずです」:どのルールに従っていますか?私が知っているルールによると、今年の最後の日は決して翌年の最初の週の一部ではありません... –

+3

ISO 8601に従ってhttp://en.wikipedia.org/wiki/ISO_8601 – sshow

+0

ところで、なぜその奇妙な日付形式を使用していますか?私は '2007.12.29'と書かれた日付は見たことがないと思う。 – svick

答えて

12

documentation for the CalendarWeekRule enumerationますが、具体的には、「ISO 8601に直接マッピングしない」と述べているだろうことを意味する、あなたのケースで

、 、その違いを説明するブログエントリISO 8601 Week of Year format in Microsoft .Netにリンクしています。

+0

これはすべてを説明しています。ありがとう – sshow

+7

私は回避策を見たくない。私の簡単な質問は:なぜですか?誰がそれを受けるのですか?違いを見るために10のうち2つの日付を選択する必要があるように、なぜ*わずかに*変更されますか?ちょっとイライラする... – Piddu

0

週識別子が一意である必要はありません。特定の週に必ず7日間かかるとは限りません。

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

1

CalendarWeekRuleの値を見てください。あなたはFirstFourDayWeekを使用しているので、あなたが説明している値を取得しています。毎週正確に7日間を使用する場合は、FirstFullWeekを使用してください。 31. 12. 2007は週53であってもよいが、そう2. 1. 2008年

+1

その解決策はISO 8601に準拠していません。*開始日の過半数(4日以上)年[1週目] * – sshow