V letošním roce je (opět) patrné, že .NET používá jiné číslování týdnů, než je standardizováno v České republice.
Upozornil nás na to klient, jehož aplikace letos používala čísla týdnů o jedno vyšší, než podle papírového kalendáře, přestože vloni fungovala správně.
Jak to má být:
V ČR se pro reprezentaci času používá (stejně jako ve většine Evropy) norma ISO 8601 (v ČR převzatá jako ČSN ISO 8601) a podle té je první týden v roce takový, který obsahuje 4. leden.
Jak to je:
Číslo týdne pro zvolené datum se v .NETu získá metodou
Calendar.GetWeekOfYear(datum, weekRule, firstDayOfWeek).
Instanci třídy Calendar získáme např. z CultureInfo.CurrentCulture.Calendar.
Problém je právě v tom, odkud dodat hodnotu parametrů weekRule (pravidlo pro číslování týdnů). Rozumné by bylo převzít ho z aktuálního regionálního nastavení, tedy z
CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule.
Bohužel, ta pro českou kulturu (cs-CZ) vrací hodnotu FirstDay (tedy číslování se začíná v týdnu, který obsahuje první leden).
Tedy zápis
CultureInto.CurrentCulture.Calendar.GetWeekOfYear(
datum,
CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule,
CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek).
nevrátí číslo týdne, platné v ČR.
Jak to řešit:
Natvrdo (resp. po ověření, že aktuální CultureInfo je české) používat hodnotu CalendarWeekRule.FirstFourDayWeek.
Správné číslo týdne tedy vrátí výraz
CultureInto.CurrentCulture.Calendar.GetWeekOfYear(
datum,
CalendarWeekRule.FirstFourDayWeek,
CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
Poznámka:
Podobně se chová (ve výchozím nastavení) i český MS Outlook 2007.
I zde lze ale přepnout na pravidlo číslování týdnů přes
Nástroje/Možnosti/Možnosti kalendáře/První týden roku: "První týden se 4 dny"