公式の (グレゴリオ暦) 暦によると、 2008 年12 月 29 日の週番号は 1 です。これは、52 週の最終日 (つまり、12 月 28 日) の後に、1 年に 3 日以下しか残っていないためです。ちょっと奇妙ですが、OK、ルールはルールです。
このカレンダーによると、2008/2009 年のこれらの境界値があります。
- 28/12 は第 52 週です
- 29/12 は第 1 週です
- 1/1 は週 1 です
- 8/1 は第 2 週です
C# は、関数を持つ GregorianCalendar クラスを提供しますGetWeekOfYear(date, rule, firstDayOfWeek)
。
パラメータrule
は、3 つの可能な値を持つ列挙型です: FirstDay, FirstFourWeekDay, FirstFullWeek
. 私が理解したことから、私はFirstFourWeekDay
ルールに従うべきですが、念のためそれらすべてを試しました。
最後のパラメーターは、どの曜日が週の最初の日と見なされるかを通知します。そのカレンダーによれば、月曜日なので月曜日です。
そこで、これをテストするために、簡単で汚いコンソール アプリを起動しました。
using System;
using System.Globalization;
namespace CalendarTest
{
class Program
{
static void Main(string[] args)
{
var cal = new GregorianCalendar();
var firstWeekDay = DayOfWeek.Monday;
var twentyEighth = new DateTime(2008, 12, 28);
var twentyNinth = new DateTime(2008, 12, 29);
var firstJan = new DateTime(2009, 1, 1);
var eightJan = new DateTime(2009, 1, 8);
PrintWeekDays(cal, twentyEighth, firstWeekDay);
PrintWeekDays(cal, twentyNinth, firstWeekDay);
PrintWeekDays(cal, firstJan, firstWeekDay);
PrintWeekDays(cal, eightJan, firstWeekDay);
Console.ReadKey();
}
private static void PrintWeekDays(Calendar cal, DateTime dt, DayOfWeek firstWeekDay)
{
Console.WriteLine("Testing for " + dt.ToShortDateString());
Console.WriteLine("--------------------------------------------");
Console.Write(CalendarWeekRule.FirstDay.ToString() + "\t\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, firstWeekDay));
Console.Write(CalendarWeekRule.FirstFourDayWeek.ToString() + "\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, firstWeekDay));
Console.Write(CalendarWeekRule.FirstFullWeek.ToString() + "\t\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, firstWeekDay));
Console.WriteLine("--------------------------------------------");
}
}
}
...そしてこれが私が得たものです
Testing for 28.12.2008
--------------------------------------------
FirstDay 52
FirstFourDayWeek 52
FirstFullWeek 51
--------------------------------------------
Testing for 29.12.2008
--------------------------------------------
FirstDay 53
FirstFourDayWeek 53
FirstFullWeek 52
--------------------------------------------
Testing for 01.01.2009
--------------------------------------------
FirstDay 1
FirstFourDayWeek 1
FirstFullWeek 52
--------------------------------------------
Testing for 08.01.2009
--------------------------------------------
FirstDay 2
FirstFourDayWeek 2
FirstFullWeek 1
--------------------------------------------
ご覧のとおり、上記の組み合わせはいずれも公式のカレンダーと一致しません (お急ぎの場合は、12 月 29 日が第 1 週にならないことを確認してください)。
ここで何が間違っていますか?たぶん、私が見逃している何かがはっきりしているでしょうか?(今日は金曜日で、ここベルギーでは勤務時間が遅くなります。ご了承ください ;))
編集:説明する必要があるかもしれません:必要なのは、リンクしたグレゴリオ暦と同じ結果を返す、どの年でも機能する関数です。したがって、2008 年の特別な回避策はありません。