HowTo:Linux:Konverzia dátumov v bash'i
Z Betlista.net
Pre zistenie aktuálneho dátumu a času v bash'i slúži príkaz date.
$ date So sep 15 15:27:21 CEST 2007
Príkaz date je však ešte o mnoho použitaľnejší ako len na vypísanie aktuálneho času, prípadne jeho zmenu, dokáže dátum aj formátovať. Napríklad keď chcem dátum vo formáte v akom sa používa na slovensku, tak by som zadal
$ date +"%-d.%-m.%Y" 15.9.2007
To, že sa mi čísla nedoplňujú nulami je spôsobené znakom '-', bez neho by bol výstup:
$ date +"%d.%m.%Y" 15.09.2007
Pre mená súborov (kvôli triedeniu) používam iný formát %Y%m%d, alebo %Y-%m-%d čo je skrátene %F
$ date +%F 2007-09-15
- keby ste potrebovali generovať súbory častejšie ako za jeden deň, tak odporúčam formát:
$ date +"%F_%T" 2007-11-25_23:57:44
Ďalšie formáty nájdete v manuálovej stránke date'u.
man date
V linuxe (Unix'e) sa nezriedka stretnete s reprezentáciou času ako počet sekúnd od 1.1.1970, toto číslo samozrejme vieme získať aj pomocou date a to:
$ date +%s 1189863530
Dôležité je vedieť s týmto dátumom pracovať. Zkonvertovať na dátum čitateľný pre človeka ho môžete príkazom
$ date --date @1189863530 So sep 15 15:38:50 CEST 2007
Samozrejme ho môžete ďalej formátovať
$ date --date @1189863530 +%F 2007-09-15
Keďže som spomenul prepínač --date, tak ešte poviem že pomocou tohto prepínača môžete dátumy medzi sebou konvertvať, ale nakoľko nie možné zadať formát vstupného reťazca, tak to rozpoznáva len niektoré reťazce. Buhužial pre nás to napríklad reťazec 15.9.2007 nerozpozná a na reťazec 15/09/2007 to hodí chybu, pretože to berie vo formáte mesiac/deň/rok a 15. mesiac nie je, takže možnosti sú dosť omedzené. Aj napriek tomu sa to občas môže hodiť, napr:
$ date --date=2007-09-15 +"%d.%-m.%Y" 15.9.2007
Zaujímavou operáciou tiež je posúvanie dátumov. Ak ste čítali článok od začiatku, asi je jasné, že sa to dá urobiť pomocou konverzie do sekúnd a pričítavania a odčítavania.
$ date --date @$((1189863530+86400)) +%F 2007-09-16
Ale podľa mňa čitateľnejšou formou je
$ date --date "1 day" +%F 2007-09-16
Toho sa dá dobre využiť aj pri programovaní, keď tomu nevadí ani 2 day (ale zoberie to aj 2 days), no dokonca ani -1 day, pretože pre časy do minulosti je určená konštrukcia 1 day ago
$ date --date "-1 day" +%F 2007-09-16 $ date --date "1 day ago" +%F 2007-09-16
V tejto čitateľnej forme to zvláda, pokiaľ viem:
- sekundu = second(s)
- minútu = minute(s)
- hodinu = hour(s)
- deň = day(s)
- týždeň = week(s)
- mesiac = month(s)
- rok = year(s)
Kľúčové slová
dátum, datum, bash
