Kdy má rok 53 týdnů
aneb kdy jsou dva liché týdny hned za sebou
Nejdříve důležité upozornění: všechen text se týká let od roku 2001, do roku 2000 bylo totiž v platnosti jiné číslování týdnů.
Jednou za čas má rok maximální pořadové číslo týdne 53 a nikoliv běžných 52. Z toho plyne zajímavý fakt, že na přelomu tohoto roku a následujícího, jsou dva liché týdny hned za sebou. Stává se tak jednou za pět či šest let a jednou za 400 let je to za sedm let. V celém čtyřsetletém cyklu gregoriánského kalendáře (kdy se opakují kalendářní data ve stejném pořadí) existuje 71 roků, které mají maximální pořadové číslo týdne rovno 53. Níže je jednoduchá tabulka jednoho cyklu kalendáře od roku 2001 do roku 2400. Roky které mají 53 týdnů jsou zvýrazněny. Nejdelší sedmiletá mezera mezi těmito roky je pak v letech 2296 až 2303.
Rok má 53 týdnů pokud začíná nebo končí čtvrtkem. Nebo totéž jinak: rok má 53 týdnů jestliže má nedělní písmeno rovno D, DC nebo ED. Proč tomu tak je? Nejdříve je potřebné připomenout číslování týdnů dle v současnosti platné normy ISO 8601: Pokud rok začíná ve čtvrtek či dříve, jde o první týden v roce. Tedy aby měl rok 53 týdnů musí být splněna právě jedna z tří možností:
- Pokud obyčejný rok začíná čtvrtkem, končí také čtvrtkem. Tedy 1. leden patří do prvního týdne a 31. prosinec patří do 53 týdne, neboť následující rok začíná až v pátek. Takovýto rok má nedělní písmeno D.
- Pokud přestupný rok začíná čtvrtkem, končí pátkem. Tedy 1. leden patří do prvního týdne a 31. prosinec patří do 53 týdne, neboť následující rok začíná až v sobotu. Takovýto rok má nedělní písmeno DC.
- Pokud přestupný rok začíná středou, končí čtvrtkem. Tedy 1. leden patří do prvního týdne a 31. prosinec patří do 53 týdne, neboť následující rok začíná až v pátek. Takovýto rok má nedělní písmeno ED.
Výpočet
Při výpočtu, kdy bude mít daný rok 53 týdnů, si pomůžeme jednoduchým vzorečkem, který udává den týdne pro jakýkoliv den v roce od března do prosince:
Vždy se počítá pouze s celými čísly, znak '%' značí operátor zbytek po dělení. Ovšem pro každý vybraný den v roce je nutno sestavit převodní tabulku. Pro 31. prosinec (tedy konec roku) zhotovíme jednoduchou tabulku výsledků:
výsledek | 31. prosinec |
---|---|
0 | neděle |
1 | pondělí |
2 | úterý |
3 | středa |
4 | čtvrtek |
5 | pátek |
6 | sobota |
Tedy pokud vzoreček vrátí pro daný rok číslo 4, rok končí čtvrtkem a splňuje nutnou podmínku pro maximální číslo týdne 53. Jestliže jde o obyčejný rok, tak navíc také začíná čtvrtkem (nedělní písmeno D). Jde-li o přestupný rok, pak začíná středou (nedělní písmeno ED). Nakonec musíme otestovat možnost pro přestupný rok, který začíná čtvrtkem a končí pátkem (nedělní písmeno DC). Nejjednodušší metoda je otestovat předchozí rok, zda-li končí středou - to vzorec musí vrátit 3 (to samozřejmě platí i pro všechny roky s nedělním písmenem D). Čili pokud vzorec pro daný rok vrátí 4 nebo pro předchozí rok vrátí 3, jde o rok s maximálním číslem týdne 53 a další týden (v následujícím roce) bude mít číslo 1. Výsledkem je, že existují dva liché týdny hned za sebou.
Tento algoritmus v programovacím jazyce Python3, který vypíše roky s 53 týdnem, může vypadat například takto (znak '//' je operátor celočíselného dělení):#!/usr/bin/python3 # -*- coding: utf8 -*- def denTydne31prosinec(r): return (r + r // 4 - r // 100 + r // 400) % 7 for rok in range(2001, 2401): if denTydne31prosinec(rok) == 4 or denTydne31prosinec(rok - 1) == 3: print(rok)
Nebo si pro roky s nedělním písmenem D a DC (kdy testujeme den týdne pro začátek roku), pomůžeme druhým vzorečkem, který udává den týdne pro jakýkoliv den v roce od ledna do února:
Pro 1. leden (tedy začátek roku) opět zkonstruujeme jednoduchou tabulku výsledků:
výsledek | 1. leden |
---|---|
0 | pondělí |
1 | úterý |
2 | středa |
3 | čtvrtek |
4 | pátek |
5 | sobota |
6 | neděle |
Jestliže tento druhý vzoreček vrátí 3, rok začíná čtvrtkem. Takže pokud první vzorec pro daný rok vrátí 4 (týká se roků s nedělním písmenem D a ED) nebo druhý vzorec rok vrátí 3 (jedná se o roky D a DC), jde o rok s maximálním číslem týdne 53.
Tento algoritmus v jazyce Python3:#!/usr/bin/python3 # -*- coding: utf8 -*- def denTydne31prosinec(r): return (r + r // 4 - r // 100 + r // 400) % 7 def denTydne1leden(r): return ((r - 1) + (r - 1) // 4 - (r - 1) // 100 + (r - 1) // 400) % 7 for rok in range(2001, 2401): if denTydne31prosinec(rok) == 4 or denTydne1leden(rok) == 3: print(rok)
Další informace:
- Číslo týdne
- Zdejší roční pracovní kalendář, který zobrazuje liché a sudé týdny
- Nedělní písmeno
- Norma ISO 8601
- Tabulku čísel týdnů a dnů v nich obsažených pro jednotlivé roky najdete na stránce přehledná tabulka týdnů
- Čtrnáct kalendářů
- Patnáct kalendářů
- Jak jednoduše zjistit den v týdnu pro dané datum