Linux: Kniha kouzel, vanilková příchuť 1.17 (27. února 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

4. Datum, čas a kalendář

Řada 1.x vanilkové příchuti Linuxu: Knihy kouzel je od 1. října 2020 do 1. března 2023 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje novější vývojové řadě určené pro novější verze operačního systému a programů. Pokud nejste vázáni na starší verze programů, doporučuji vyhledat novou verzi z aktivně vyvíjené vývojové řady.
čas tematický okruh

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í, konverze časových zón a vizualizace.

Tato verze kapitoly nepokrývá menstruační kalendář, výpočet časů astronomických jevů včetně východu a západu slunce, výpočet času muslimských modliteb ani méně obvyklé druhy kalendářů (čínský apod.).

Plánování úloh na konkrétní čas do této kapitoly nespadá.

2. Definice

3. Zaklínadla

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#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 Kalendář

zobrazit kalendář měsíce a dvou okolních#1
ncal -M3[b][w] [měsíc-1-až-12 rok]
۶zobrazit kalendář měsíce#2
ncal -M[b][w] [měsíc-1-až-12] rok
zobrazit kalendář všech měsíců v roce#3
ncal -Mb[w] rok
zobrazit kalendář měsíce a N následujících#4
ncal -M[b][w] -A N [měsíc-1-až-12] rok

3/5 Aktuální čas a datum

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 Č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"
vypsat seznam podporovaných časových zón, seřazený podle jejich aktuální odchylky od UTC#3
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#4
timedatectl list-timezones
˕vypsat aktuální časovou zónu nastavenou v systému#5
cat /etc/timezone

3/7 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))
je rok přestupný?#4
test 61 -eq $(date -d rok-03-01 +%-j)

3/8 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)))

3/9 Svátky

zjistit datum Velikonoční neděle#1
date -d "$(LC_ALL=C ncal -e [rok])" +%F

3/10 Systémový a hardwarový čas

přepnout časovou zónu systému (ručně)#1
sudo dpkg-reconfigure tzdata
V dialogu zvolte požadovanou oblast a konkrétní časovou zónu.
přepnout časovou zónu systému (automaticky)#2
timedatectl set-timezone "nová/zóna"
Restartujte počítač, aby všechny programy změnu zaregistrovaly a přijaly.
vypnout/zapnout automatickou synchronizaci systémového času#3
timedatectl set-ntp off
timedatectl set-ntp on
ručně nastavit systémový čas#4 (9)
timedatectl set-ntp off
timedatectl set-time "nový lokální čas"
ručně nastavit hardwarový čas#5 (10)
sudo hwclock --set --date 'lokální datum čas'
nastavit systémový čas z hardwarového/hardwarový ze systémového#6
sudo hwclock -s
sudo hwclock -w
zobrazit hardwarový čas (lokální/UTC)#7
sudo hwclock -r
sudo hwclock -r | date -u -f - '+%F %T.%6N%z'
ručně synchronizovat systémový čas#8

4. Parametry příkazů

4/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.

4/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ů.

5. Instalace na Ubuntu

Veškeré použité nástroje jsou základními součástmi Ubuntu dostupnými v minimální instalaci.

6. 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))

7. Tipy a zkušenosti

8. Další zdroje informací

man date
man ncal
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 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á.
10 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!
Barvy, titulek a výzva termináluRegulární výrazySed