Oblicz dni od 1 stycznia 1970 r


10

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 ?


W Bash i najnowocześniejszych powłokach Bourne'a $()jest bardziej preferowany niż backtyki ze względu na czytelność i inne powody . echo $(( $(date ...) / 86400 ))
Wstrzymano do odwołania.

Nie mam jeszcze 2000 ... Czy ktoś może edytować i naprawić tytuł :-)
Pierścień Ø

Odpowiedzi:


20

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ść.


1
co z sekundami przestępnymi? :)
netvope

1
@netvope Po dodatkowym drugim skoku czas unix jest resetowany o jeden raz. Więc każdego dnia dodaje dokładnie 86400 sekund uniksowych. Jednak czas uniksowy 915148800 może oznaczać zarówno UTC 1998-12-31T23: 59: 60, jak i 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski

9

dateKomenda może dać liczbę sekund od 1970-01-01 00:00:00 UTC.

  date +"%s"

Możesz podzielić wynik przez, 3600*24aby uzyskać liczbę dni (UTC).

Np. W Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

aby wyświetlić liczbę dni.


9

Myślę, że to najprostsza metoda:

expr $(date +%s) / 86400

Dlaczego jest to zaniżone? To najlepsza, najkrótsza i najprostsza odpowiedź
Tom Corelis,

1

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 +%-:::zspowoduje błąd „nieprawidłowy znak w wyrażeniu” w przypadku użycia w powyższej instrukcji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.