Jak obliczyć liczbę dni od 1/1/1970? Służy do aktualizacji atrybutu shadowLastChange w OpenLDAP.
Czy można to zrobić za pomocą polecenia daty linux ?
Jak obliczyć liczbę dni od 1/1/1970? Służy do aktualizacji atrybutu shadowLastChange w OpenLDAP.
Czy można to zrobić za pomocą polecenia daty linux ?
Odpowiedzi:
ring0 pokonał mnie o kilka sekund, ale pełne polecenie to:
echo $(($(date --utc --date "$1" +%s)/86400))
To czas UTC. Wynik:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Szybkie sprawdzenie z WolframAlpha pokazuje, że jest to prawidłowa wartość.
date
Komenda może dać liczbę sekund od 1970-01-01 00:00:00 UTC
.
date +"%s"
Możesz podzielić wynik przez, 3600*24
aby uzyskać liczbę dni (UTC).
Np. W Bash
x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))
aby wyświetlić liczbę dni.
Myślę, że to najprostsza metoda:
expr $(date +%s) / 86400
Musiałem też to rozwiązać, ale chciałem uzyskać tę samą wartość dla dnia # niezależnie od pory dnia. Przy podejściach takich jak tutaj pokazane, wartość zmieni się o północy UTC zamiast o północy czasu lokalnego. Prawdopodobnie wydaje się to mniejszym problemem w UE lub wschodnim wybrzeżu USA, które są wystarczająco blisko UTC, aby wartość dnia nie zmieniła się w środku typowego dnia roboczego, ale np. W Kalifornii zmiana dnia wystąpiłoby o 16:00 czasu PST, co może być niewygodne. Wyobrażam sobie, że Australijczycy byliby szczególnie zirytowani, gdyby zmiana wartości dnia nastąpiła późnym rankiem.
Jeśli chcemy to poprawić, musimy dodać przesunięcie względem UTC przed podzieleniem przez sekundę / dzień. Na szczęście polecenie daty w systemie Linux zawiera sekwencję formatu % z , która zgłasza przesunięcie względem UTC. Podczas gdy standardowy format (ten wynik dotyczy czasu Denver, MDT):
$ date +%z
-0600
. . . nie jest bezpośrednio użyteczne w obliczeniach, odpowiednie modyfikatory dadzą to, czego chcemy:
$ date +%-:::z
-6
Połączmy to ze zwykłymi konwersjami sekund / godzin / dni i uważam, że następujące dane powinny generować dni od 1/1/1970, przy czym 1/1/1970 to dzień zero, a wartość wzrasta o północy czasu lokalnego:
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
To proste obliczenie nie będzie działać dla stref czasowych, które nie są przesunięte względem UTC o całe godziny (np. Indie, TZ = Azja / Kalkuta), ponieważ wygenerowane przez „+5: 30” date +%-:::z
spowoduje błąd „nieprawidłowy znak w wyrażeniu” w przypadku użycia w powyższej instrukcji.
$()
jest bardziej preferowany niż backtyki ze względu na czytelność i inne powody .echo $(( $(date ...) / 86400 ))