Linux: Kniha kouzel, 2.15 (1. března 2025)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

5. Datum, čas a kalendář

Vývoj vanilkové příchuti Linuxu: Knihy kouzel byl 1. března 2025 ukončen. Tento text je zachován jako historický, ale chyby již nejsou opravovány. Odnože projektu pod kompatibilní licencí jsou vítány.

1. Úvod

Obsahem této kapitoly je veškerá práce s hodnotami času a data a kalendářem jako takovým, to znamená výpočty, formátování, práci s časovými zónami a vizualizace. Kapitola rovněž pokrývá nastavování systémového a hardwarového času.

Příkaz „date“ je vyvíjen v rámci projektu GNU.

2. Definice

  • Časová známka Unixu je číselná reprezentace okamžiku v čase daná počtem sekund od 00:00:00 UTC 1. ledna 1970. Čas před tímto milníkem se reprezentuje zápornými čísly, pozdější čas kladnými. Obvykle se uvažují celá čísla, ale některé implementace pracují i s desetinnými. Časová známka Unixu se uvádí téměř výhradně v desítkové soustavě.
  • Systémový čas je čas zpřístupněný systémem programům. Při startu systému se nastaví podle hardwarového času a zaniká vypnutím operačního systému. Systémový čas je obvykle v lokální časové zóně. Protikladem je hardwarový čas, což je čas poskytovaný zařízením na základní desce počítače. Hardwarový čas je obvykle v UTC.
  • UTC je základní celosvětový čas, od kterého se odvozují hodnoty času v jednotlivých časových zónách.

3. Zaklínadla: Obecná

3/1 Výstupní formát („date +“ a „strftime“)

Číselné hodnoty (kromě %s) se automaticky zarovnávají nulami (např. leden je měsíc 01), potlačit to můžete vložením „-“ za %, např. „%-m“ vrátí pro leden „1“; pro zarovnání mezerami místo nulami tam vložte „_“, např. „%_m“ vrátí pro leden „ 1“.

@lokalizované celky#1
%x⊨ datum = 31.12.2019
%X⊨ čas (24hodinový) = 23:59:59
%r⊨ čas (12hodinový) = 11:59:59
%c⊨ datum a čas (24hodinový) = Út 31. prosince 2019, 23:59:59 CET
@nelokalizované celky#2
%D⊨ %m/%d/%y = 12/31/19
%F⊨ %Y-%m-%d = 2019-12-31
%R⊨ %H:%M = 23:59
%T⊨ %H:%M:%S = 23:59:59
@den v týdnu (alternativy)#3
%A⊨ Úterý (plný název, lokalizovaný)
%a⊨ Út (zkratka, lokalizovaná)
%u⊨ 2 (číslo 1..7, kde 1 je pondělí)
%w⊨ 2 (číslo 0..6, kde 0 je neděle)
@rok (alternativy)#4
%Y⊨ 2010 (4 číslice)
%C⊨ 20 (století)
%y⊨ 10 (dvojčíslí roku)
@čtvrtletí (ne strftime)#5
%q⊨ 3 (číslo 1..4)
@měsíc (alternativy)#6
%m⊨ 03 (číslo)
%B⊨ listopad (plný název, lokalizovaný)
%b⊨ lis (zkratka, lokalizovaná)
@den v měsíci (alternativy)#7
%d⊨ 03 (číslo)
%e⊨  3 (číslo zarovnané mezerou)
@hodina + období dne (alternativy)#8
%H⊨ 15 (číslo 00..23)
%I⊨ 03 (číslo 01..12)
%p⊨ AM/PM (lokalizovaně)
%P⊨ am/pm (lokalizovaně)
@minuta#9
%M⊨ 59 (číslo 00..59)
@sekunda#10
%S⊨ 59 (číslo 00..61)
@zlomky sekundy (ne strftime)#11 (1)
%[číslic]N⊨ 123456789 (počítadlo nanosekund)
@časová zóna#12 (2)
%Z⊨ CET (zkratka časové zóny)
%z⊨ +0100
%:z⊨ +01:00
%::z⊨ +01:00:00
%:::z⊨ +01 (nejkratší přesné vyjádření)
@číslo týdne podle ISO normy (týden začíná pondělím)#13
%G⊨ 2010 (celé číslo roku)
%g⊨ 10 (dvojčíslí roku)
%V⊨ 03 (číslo týdne 01..53)
@číslo týdne v roce#14
%W⊨ 07 (00..53, týden začíná pondělím)
%U⊨ 07 (00..53, týden začíná nedělí)
@odzvláštněné znaky (alternativy)#15
%%⊨ %
%n⊨ konec řádku
%t⊨ tabulátor
@časová známka Unixu (ne strftime)#16
%s⊨ 1577833199
@číslo dne v roce#17
%[-]j⊨ 001

3/2 Doporučené vstupní formáty času („date -d“)

@lokální čas (alternativa 1/2/příklady...)#1 (3)(4)
rok-měsíc-den hodina:minuta:sekunda[.f]
rok-měsíc-denThodina:minuta:sekunda[.f]
2019-12-31 23:59:59
2019-12-31 23:59:59.123456789
2019-12-31T23:59:59.123456
@čas s udaným posunem proti UTC (obecně/příklady)#2 (5)
rok-měsíc-den hodina:minuta:sekunda[.f][ ]posun
rok-měsíc-denThodina:minuta:sekunda[.f]posun
2019-12-31 23:59:59.123456789 -0100
2019-12-31T23:59:59.123456+0100
@čas v udané časové zóně (obecně/příklady...)#3
TZ="časová/zóna" rok-měsíc-den hodina:minuta:sekunda[.f]
TZ="Europe/Prague" 2019-12-31 23:59:59.123456
TZ="UTC" 2019-12-31 23:59:59.123456789
@UTC čas (alternativy)#4
rok-měsíc-den hodina:minuta:sekunda[.f]Z
rok-měsíc-denThodina:minuta:sekunda[.f]Z
rok-měsíc-den hodina:minuta:sekunda[.f][ ]+0000
rok-měsíc-denThodina:minuta:sekunda[.f]+0000
TZ="UTC" rok-měsíc-den hodina:minuta:sekunda[.f]
@časová známka Unixu (obecně/příklady)#5 (6)
@číslo
@1577750400
@-12345.6789
@půlnoc daného dne (obecně/příklad)#6 (7)
rok-měsíc-den
2019-12-31

Příkaz „date“ podporuje i mnoho dalších vstupních formátů; úplná dokumentace v angličtině je dostupná příkazem „info date“, ale v praxi doporučuji omezit se pouze na zde uvedené.

3/3 Čekání

@počkat určitou dobu#1 (8)
sleep sekund

3/4 Gregoriánský kalendář

@je rok přestupný?#1
test 61 -eq $(date -d rok-03-01 +%-j)
@zobrazit kalendář měsíce a dvou okolních#2
ncal -M3[b][w] [měsíc-1-až-12 rok]
@zobrazit kalendář měsíce#3
ncal -M[b][w] [měsíc-1-až-12] rok
@zobrazit kalendář všech měsíců v roce#4
ncal -Mb[w] rok
@zobrazit kalendář měsíce a N následujících#5
ncal -M[b][w] -A N [měsíc-1-až-12] rok

3/5 Aktuální čas a datum (všechny kalendáře)

@vypsat aktuální čas (resp. datum): lokální/UTC/v určité časové zóně#1
date [+formát]
date -u [+formát]
TZ="časová/zóna" date [+formát]
@zobrazit kalendář aktuálního měsíce a dvou okolních#2
ncal -M3[b][w]

3/6 Východ a západ slunce, Velikonoce

@zjistit čas východu a západu slunce (obecně/příklad: Václavské náměstí v Praze)#1 (9)
TZ=UTC hdate -qsT -l pozice-NS -L pozice-WE $(($(date -d 'datum 00:00:00' +%s) / 86400 + 2440589)) | sed -E '/^[0-9]/!d;s/\.([0-9])\./.0\1./g;s/^([0-9]+)\.([0-9]+)\.([0-9]+),[^,]*,([^,]+),([^,]+).*/TZ="UTC" \3-\2-\1 \4:00\nTZ="UTC" \3-\2-\1 \5:00/' [| [TZ="časová/zóna"] date -f - "+%F %T %z"]
TZ=UTC hdate -qsT -l N50.0810578 -L E14.4279506 $(($(date -d '2020-08-19 00:00:00' +%s) / 86400 + 2440589)) | sed -E '/^[0-9]/!d;s/\.([0-9])\./.0\1./g;s/^([0-9]+)\.([0-9]+)\.([0-9]+),[^,]*,([^,]+),([^,]+).*/TZ="UTC" \3-\2-\1 \4:00/' | date -f - "+%F %T %z"
@zjistit datum Velikonoční neděle#2
date -d "$(LC_ALL=C ncal -e [rok])" +%F

4. Zaklínadla: Konverze data a času a časová aritmetika

4/1 Konverze časové zóny

@konverze z UTC na lokální čas/z lokálního času na UTC#1
date -d "TZ=\"UTC\" čas-UTC" "+%F %T"
date -ud "TZ=\"$(cat /etc/timezone)\" lokální čas" "+%F %T"
date -ud "@$(date -d "čas" +%s)" "+%F %T"
@konverze z jedné časové zóny do druhé (obecně/příklad)#2
TZ="cílová/časová/zóna" date -d 'TZ="zdrojová/časová/zóna" čas' "+%F %T[ %z]"
TZ="America/New_York" date -d 'TZ="Asia/Vladivostok" 2019-01-01 12:35:57' "+%F %T %z"

4/2 Aritmetika s datem

@konverze data na „číslo dne“/zpět#1
printf %s\\n $(($(date -ud datum +%s) / 86400))
date -ud "@$((číslo-dne * 86400))" +%F
@přičíst/odečíst N dní#2
date -ud @$((N * 86400 + $(date -ud "datum" +%s))) +%F
date -ud @$((-N * 86400 + $(date -ud "datum" +%s))) +%F
@rozdíl ve dnech#3
printf %s\\n $((($(date -ud datum +%s) - $(date -ud odečítané-datum +%s)) / 86400))

4/3 Artimetika s časem

@konverze lokálního/UTC času na časovou známku Unixu#1
date -d "čas" +%s
date -ud "čas" +%s
@konverze časové známky Unixu na lokální čas/UTC#2
date -d @časová-známka "+%F %T[ %z]"
date -ud @časová-známka "+%F %T"
@přičíst/odečíst N sekund (v UTC)#3
date -ud @$(($(date -ud "datum čas" +%s) + N )) "+%F %T"
date -ud @$(($(date -ud "datum čas" +%s) - N )) "+%F %T"
@rozdíl UTC časů v sekundách#4
printf %s\\n $(($(date -ud čas +%s) - $(date -ud odečítaný-čas +%s)))

4/4 Konverze kalendářů

@konverze data gregoriánského kalendáře na juliánský/naopak#1
@konverze data gregoriánského kalendáře na hebrejský/naopak#2
@konverze data gregoriánského kalendáře na arabský/naopak#3

5. Zaklínadla: Nastavení systému

5/1 Časové zóny

@vypsat seznam podporovaných časových zón, seřazený podle jejich aktuální odchylky od UTC#1
timedatectl list-timezones | sed 's/.*/TZ="&" date +%z; echo &/' | bash | xargs -rd \\n -n 2 printf "%s\\t%s\\n" | LC_ALL=C sort | sort -ns
@vypsat seznam podporovaných časových zón#2
timedatectl list-timezones
@vypsat aktuální časovou zónu nastavenou v systému (alternativy)#3
cat /etc/timezone
readlink /etc/localtime | sed -E 's!.*/share/zoneinfo/!!'
@nastavit časovou zónu pro celý systém#4 (10)
sudo timedatectl set-timezone časová/zóna
@nastavit časovou zónu pro nový proces#5
TZ="časová/zóna" příkaz [parametry]

5/2 Systémový a hardwarový čas

@vypnout/zapnout automatickou synchronizaci systémového času#1
timedatectl set-ntp off
timedatectl set-ntp on
@ručně nastavit systémový čas#2 (11)
timedatectl set-ntp off
timedatectl set-time "nový lokální čas"
@ručně nastavit hardwarový čas#3 (12)
sudo hwclock --set --date 'lokální datum čas'
@nastavit systémový čas z hardwarového/hardwarový ze systémového#4
sudo hwclock -s
sudo hwclock -w
@zobrazit hardwarový čas (lokální/UTC)#5
sudo hwclock -r
sudo hwclock -r | date -u -f - '+%F %T.%6N%z'
@ručně synchronizovat systémový čas#6

6. Parametry příkazů

6/1 date

[TZ="cílová časová zóna"] date [parametry] [+formát]
○ -d 'datum a čas' ○ -d '"původní čas. zóna" datum a čas' ○ -f soubor ○ -f -Použije zadaný čas (parametr -d), popř. načte čas z řádků daného souboru či ze standardního vstupu (parametr -f). Výchozí chování: použije aktuální čas.
○ -uCílová časová zóna bude UTC. Výchozí chování: časovou zónu určuje proměnná prostředí TZ, popř. je to lokální čas.

6/2 ncal

ncal parametry [[měsíc] rok]
○ -M ○ -STýden začíná pondělím/nedělí. Výchozí chování určuje lokalizace systému.
○ -bTýdny tvoří řádky. Výchozí chování: týdny tvoří sloupce.
☐ -3Zobrazí také předchozí a následující měsíc.
☐ -wDo kalendáře zahrne čísla týdnů.

7. Instalace na Ubuntu

Většina použitých nástrojů je součástí minimální instalace Ubuntu; výjimkou je příkaz „hdate“, který je třeba doinstalovat:

sudo apt-get install hdate

8. Ukázka

ncal -M3bw
date "+%F %T.%9N %z%t(%s.%9N)"
date -u "+%F %T.%9N %z%t(%s.%9N)"
date -d "TZ=\"America/New_York\" 2000-02-29 12:01:02.123" "+%FT%T.%9N%z"
date -ud "TZ=\"America/New_York\" 2000-02-29 12:01:02.123" "+%FT%T.%9N%z"
TZ="America/New_York" date -d "TZ=\"America/New_York\" 2000-02-29 12:01:02.123" "+%FT%T.%9N%z"
printf %s\\n $((($(date -ud 2001-01-01 +%s) - $(date -ud 2000-01-01 +%s)) / 86400))

9. Tipy a zkušenosti

  • Specifikace časové zóny či posunu mají následující prioritu: 1) parametr -d; 2) parametr -u; 3) proměnná prostředí TZ; 4) časová zóna systému.

10. Další zdroje informací

man date
man ncal

11. Zákulisí kapitoly

V této verzi kapitoly chybí:

  • menstruační kalendář
  • výpočet času muslimských modliteb
  • konverze mezi druhy kalendářů (juliánský, gregoriánský, hebrejský, čínský apod.).

Tato kapitola záměrně nepokrývá:

  • plánování úloh na konkrétní čas
1 Počet „číslic“ by měl být v rozsahu 1 až 9.
2 strftime jen %z a %Z.
3 Odpovídá formátům „%F %T“, „%FT%T.%3N“, „%F %T.%9N“, „%FT%T.%6N“ apod.
4 „f“ je jedna až devět číslic.
5 „posun“ je znaménko a čtyři číslice značící posun oproti UTC v hodinách a minutách, např. „+0100“. Odpovídá formátu „%z“.
6 „číslo“ může být kladné i záporné, celé i s desetinnou tečkou. Odpovídá formátu „%s“, resp. „%s.%N“
7 Odpovíďá formátu „+%F“.
8 Počet sekund může být i necelé číslo, např. 0.12 počká 120 milisekund. Pro hodnoty pod 100 milisekund ale neočekávejte velkou přesnost.
9 Čas východu slunce bude na první řádce výstupu, čas západu slunce na druhé. Pozice-NS je zeměpisná šířka a musí začínat písmenem N (severní) nebo S (jižní) a pokračovat číslem ve stupních a následně buď tečkou a desetinnou částí (např. N50.08105), nebo minutami a sekundami oddělenými dvojtečkami (např. N50:4:52). Pozice-WE je zeměpisná šířka ve stejném formátu, ale písmeno je W (západní) nebo E (východní). Datum se zadává ve standardním formátu YYYY-MM-DD. Přesnost výpočtu jsem podrobně nezkoumal/a, ale neočekávajte vyšší přesnost než tak plus minus dvě minuty.
10 Změna časové zóny má okamžitou platnost a vydrží i po restartu.
11 Zadejte čas a datum ve formátu „YYYY-MM-DD HH:MM:SS“. Poznámka: Jsou-li ve VirtualBoxu nainstalované přídavky pro hosta, tyto přídavky velmi často systémový čas vnitřního systému (hosta) synchronizují se systémovým časem vnějšího systému (hostitele), proto v takovém případě změna systémového času vnitřního systému vydrží jen velmi krátce a je sotva pozorovatelná.
12 Datum a čas by měly být ve formátu „YYYY-MM-DD HH:MM:SS“, dovoleny jsou i jiné formáty. Pozor, je vyžadován lokální čas v časové zóně systému, a to i v případě, že ve skutečnosti je hardwarový čas uložen v UTC!
[BY-SA]

Veškerý obsah této stránky (text, obrázky, zdrojový kód) je možno upravovat a šířit pod podmínkami licence Creative Commons Attribution-ShareAlike 4.0 International. Upozorňuji, že uvedená licence vyžaduje uvedení seznamu autorů, licence a zdroje a poskytnutí stejné či kompatibilní licence k provedeným změnám, jsou-li nějaké. Příslušné údaje jsou dostupné na stránce „Přehled autorů“. Šíření obsahu bez těchto údajů nebo šíření upravené verze bez poskytnutí adekvátní licence k provedeným úpravám je pravděpodobně porušení licenčních podmínek a může být postihováno. Poskytování zdrojového kódu při šíření není touto licencí vyžadováno.

Pro nové verze, další informace, aktuální zdrojový kód a možnost se zapojit do projektu „Linux: Kniha kouzel“ navštivte jeho repozitář na GitHubu.