Řešení 1:
ring0 mě porazil o několik sekund, ale celý příkaz je:
echo $(($(date --utc --date "$1" +%s)/86400))
Jde o čas UTC. Výsledek:
[email protected]:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Rychlá kontrola pomocí WolframAlpha ukazuje, že toto je správná hodnota.
Řešení 2:
Myslím, že toto je nejjednodušší metoda:
expr $(date +%s) / 86400
Řešení 3:
date
příkaz vám může poskytnout počet sekund od 1970-01-01 00:00:00 UTC
.
date +"%s"
Výsledek můžete vydělit 3600*24
získat počet dní (UTC).
Např. v Bash
x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))
pro zobrazení počtu dní.
Řešení 4:
Potřeboval jsem to také vyřešit, ale chtěl jsem získat stejnou hodnotu pro den # bez ohledu na denní dobu. S přístupy, jako jsou ty uvedené zde, se hodnota změní o půlnoci UTC namísto půlnoci místního času. Pravděpodobně to vypadá jako menší problém v EU nebo na východním pobřeží USA, které jsou dostatečně blízko UTC, že se denní hodnota nezmění uprostřed typického pracovního dne, ale například v Kalifornii se změna dne nezmění dojde v 16:00 PST, což může být nepohodlné. Představuji si, že Australany by zvláště naštvalo, kdyby se hodnota dne změnila pozdě ráno.
Pokud to chceme opravit, musíme před dělením po sekundách/den přidat offset od UTC. Naštěstí příkaz data v Linuxu obsahuje %z sekvence formátu, která hlásí posun od UTC. Zatímco standardní formát (tento výsledek je pro denverský čas, MDT):
$ date +%z
-0600
. . . není přímo použitelný ve výpočtu, správné modifikátory přinesou to, co chceme:
$ date +%-:::z
-6
Dejte to dohromady s obvyklými převody sekund/hodin/dní a domnívám se, že následující by měly vypsat dny od 1.1.1970, přičemž 1.1.1970 je samotný den nula a hodnota se zvyšuje o půlnoci místního času:
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
Tento jednoduchý výpočet nebude fungovat pro časová pásma, která nejsou posunuta od UTC o celé hodiny (např. Indie, TZ=Asie/Kolkata), protože „+5:30“ vytváří date +%-:::z
při použití ve výše uvedeném příkazu vytvoří chybu "neplatný znak ve výrazu".