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:
@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).
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:
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.
$()
jest bardziej preferowany niż backtyki ze względu na czytelność i inne powody .echo $(( $(date ...) / 86400 ))
Odpowiedzi:
ring0 pokonał mnie o kilka sekund, ale pełne polecenie to:
To czas UTC. Wynik:
Szybkie sprawdzenie z WolframAlpha pokazuje, że jest to prawidłowa wartość.
źródło
date
Komenda może dać liczbę sekund od1970-01-01 00:00:00 UTC
.Możesz podzielić wynik przez,
3600*24
aby uzyskać liczbę dni (UTC).Np. W Bash
aby wyświetlić liczbę dni.
źródło
Myślę, że to najprostsza metoda:
źródło
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):
. . . nie jest bezpośrednio użyteczne w obliczeniach, odpowiednie modyfikatory dadzą to, czego chcemy:
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:
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.źródło