Menu ≡
kalendar.beda.cz

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:

leden6
únor2
březen2
duben5
květen0
červen3
červenec5
srpen1
září4
říjen6
listopad2
prosinec4
Jde o tabulku začátku jednotlivých měsíců v roce, pokud nepřestupný rok začíná sobotou (=6), únor začíná v úterý (=2), zrovna tak březen (=2) a tak dále. Příklad pro 13. leden 2012:

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:

DAY5.6
či přesněji
(D)DAYYYY5.6

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):

leden4
únor6
březen3
duben5
květen4
červen6
červenec5
srpen7
září9
říjen1
listopad3
prosinec2

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 - .13neděle
.14 - .27pondělí
.28 - .41úterý
.42 - .55středa
.56 - .69čtvrtek
.70 - .83pátek
.84 - .99sobota
Příklad pro stejné datum 13. leden 2012:

Ideální, lehce zapamatovatelný, univerzální způsob neexistuje. Existuje však jednoduchá pomůcka:
poslední únor, 4. 4., 6. 6., 8. 8., 10. 10., 12. 12., 9. 5., 5. 9., 11. 7. a 7. 11. jsou vždy ve stejný den týdne v jakémkoli roce,
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))

Další informace:

Kalendáře Helma - nástěnný, stolní i pracovní kalendář Diáře Helma - diář a zápisník
Válka na Ukrajině: 1002.den
Nahoru