Jak jednoduše zjistit den v týdnu pro dané datum
Existuje více způsobů, ale ani jeden není zcela ideální. Na internetu lze použít naši kalendářní kalkulačku, jinak to lze udělat za pomoci zdejšího věčného kalendáře, je však nutné mít sebou list papíru s tabulkou. Znalci si mohou dokonce vytvořit vlastní věčný kalendář. Anebo použijte zdejší univerzální roční kalendář. Pokud to však chceme zjistit zpaměti, situace se komplikuje. Jeden z nejjednodušších způsobů, který však pracuje pouze pro roky 2000 až 2099, je tento:
- vezměte poslední dvojčíslí daného roku a přičtěte k němu jeho čtvrtinu (případný zbytek po dělení pomiňte)
- podle měsíce přičtěte číslo z následující tabulky, tu je nutné si pamatovat :-(
leden | 6 |
únor | 2 |
březen | 2 |
duben | 5 |
květen | 0 |
červen | 3 |
červenec | 5 |
srpen | 1 |
září | 4 |
říjen | 6 |
listopad | 2 |
prosinec | 4 |
- přičtěte den
- pokud je rok přestupný a současně je měsíc buď leden nebo únor, odečtěte 1
- celočíselný zbytek po dělení 7, udává hledaný den týdne (pondělí=1, úterý=2, ..., sobota=6, neděle=0)
- 12 + (12/4) = 15
- 15 + 6 (číslo z tabulky pro leden) = 21
- 21 + 13 = 34
- jde o přestupný rok a současně jde o leden, tedy 34 - 1 = 33
- celočíselný zbytek po 33/7 je 5, jde tedy o pátek
Další, méně známý postup, je takzvaný Al Stangerův algoritmus. Platí od března 1900 až do února 2100. Někdy je k vidění pod tajemným zlomkem:
Podstata je jednoduchá: spojíte číslo dne, index pro měsíc a číslo roku do jediného čísla, toto pak vydělíte číslem 5.6 a ze zbytku určíte den týdne pro dané datum. Zápis (D)D znamená číslo dne v měsíci, to má jedno nebo dvě cifry. Pak zapíšete index A pro daný měsíc. Ten vyberte z následující tabulky (kterou si musíte zase pamatovat):
leden | 4 |
únor | 6 |
březen | 3 |
duben | 5 |
květen | 4 |
červen | 6 |
červenec | 5 |
srpen | 7 |
září | 9 |
říjen | 1 |
listopad | 3 |
prosinec | 2 |
Nakonec zapíšete číslo roku YYYY, zde je důležitá výjimka: pokud jde o měsíce leden či únor, je nutné od roku odečíst 1. Výsledné číslo je tedy ve tvaru (D)DAYYYY. Toto číslo pak (na kalkulačce) dělíme číslem 5.6 a z výsledku nás pak zajímá pouze desetinná část s přesností na dvě cifry. Z její hodnoty určíme dle další tabulky o jaký se jedná den týdne:
.00 - .13 | neděle |
.14 - .27 | pondělí |
.28 - .41 | úterý |
.42 - .55 | středa |
.56 - .69 | čtvrtek |
.70 - .83 | pátek |
.84 - .99 | sobota |
- (D)D je den 13
- jde o leden, pro něj má index A hodnotu 4
- rok je 2012, ale protože hledáme pro leden, musíme snížit rok o 1. YYYY je tedy 2011
- prostým spojením uvedených tří čísel dostaneme: 1342011
- toto číslo dělíme 5.6 a dostaneme 239644.82, dle zbytku .82 určíme, že jde o pátek.
Ideální, lehce zapamatovatelný, univerzální způsob neexistuje. Existuje však jednoduchá pomůcka:
ať přestupném či nepřestupném. Rozdíl ve dnech mezi těmito dny je totiž vždy dělitelný sedmi.
Jednoduchý algoritmus, funkční pro kalendářní data od 15. 10. 1582 do 31. 12. 9999, v programovacím jazyce Python3 (znak '//' je operátor celočíselného dělení):
#!/usr/bin/python3 # -*- coding: utf8 -*- """ Vypocet dne tydne dle https://en.wikipedia.org/wiki/Calculating_the_day_of_the_week#Sakamoto.27s_Method """ def denTydne(d, m, r): t = [0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4] nazevDne = ["neděle", "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota"] if m < 3: r -= 1 return nazevDne[(r + r // 4 - r // 100 + r // 400 + t[m - 1] + d) % 7] den = int(input("Zadejte den: ")) mesic = int(input("Zadejte měsíc: ")) rok = int(input("Zadejte rok: ")) print("{} {}.{}.{}".format(denTydne(den, mesic, rok), den, mesic, rok))
Pokud nás zajímá jen den týdne pro 1. leden gregoriánského kalendáře pro zadaný rok, lze použí zjednodušený algoritmus:
#!/usr/bin/python3 # -*- coding: utf8 -*- def denTydne1leden(r): nazevDne = ["pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota", "neděle"] return nazevDne[((r - 1) + (r - 1) // 4 - (r - 1) // 100 + (r - 1) // 400) % 7] rok = int(input("Zadejte rok: ")) print("{} 1.ledna {}".format(denTydne1leden(rok), rok))