Konwertuj uniksowy znacznik czasu na ciąg daty

128

Czy istnieje szybki, jednowierszowy sposób konwertowania znacznika czasu systemu Unix na datę z wiersza poleceń systemu Unix?

datemoże zadziałać, z wyjątkiem tego, że określenie każdego elementu (miesiąca, dnia, roku, godziny itp.) jest raczej niewygodne i nie mogę dowiedzieć się, jak sprawić, aby działał poprawnie. Wygląda na to, że może być łatwiejszy sposób - czy coś mi brakuje?

chimeracoder
źródło

Odpowiedzi:

181

Dzięki GNU datemożesz:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(Od: BASH: Konwertuj uniksowy znacznik czasu na datę )

W systemie OS X użyj date -r.

date -r "$TIMESTAMP"

Alternatywnie użyj strftime(). Nie jest dostępny bezpośrednio z powłoki, ale możesz uzyskać do niego dostęp przez gawk . Specyfikator %cwyświetla sygnaturę czasową w sposób zależny od ustawień regionalnych.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST
John Kugelman
źródło
3
Pamiętaj, aby wyeliminować milisekundy ze znacznika czasu (to jest tylko 10 cyfr zamiast 13), w przeciwnym razie uzyskasz nieprawidłowe wyniki (dotyczy to daty macOS).
emerino
Myślałem, że to nie działa, dopóki nie zdałem sobie sprawy, że mam znacznik czasu w milisach. Odetnij ostatnie 3 cyfry, a otrzymasz dokładny czas
Stewart,
64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Gdzie liczba za @to liczba w sekundach

qbi
źródło
28
Na OSX 10.8 jest date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) lub po prostudate -r 1278999698
Tom McKenzie,
Działa dla Ubuntu 16.04
Mike Q
24

To rozwiązanie działa z wersjami daty, które nie obsługują date -d @. Nie wymaga AWK ani innych poleceń. Znacznik czasu systemu Unix to liczba sekund od 1 stycznia 1970, czasu UTC, więc ważne jest, aby określić UTC.

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

Jeśli korzystasz z komputera Mac, użyj:

date -r 1357004952

Polecenie uzyskania epoki:

date +%s
1357004952

Podziękowania dla Anton: BASH: Convert Unix Timestamp to a Date

dabest1
źródło
10

Jak @TomMcKenzie mówi w komentarzu do innej odpowiedzi, date -r 123456789jest prawdopodobnie bardziej powszechnym (tj. Szerzej wdrażanym) prostym rozwiązaniem dla czasów podanych w sekundach od epoki Uniksa, ale niestety nie ma uniwersalnego gwarantowanego przenośnego rozwiązania.

-dOpcja na wielu rodzajach systemów oznacza coś zupełnie innego niż GNU datę za --daterozszerzeniem. Niestety GNU Date nie interpretuje -rtego samego, co inne implementacje. Więc niestety musisz wiedzieć, której wersji dateużywasz, a wiele starszych datepoleceń Uniksa nie obsługuje żadnej z tych opcji.

Co gorsza, POSIX datenie rozpoznaje -dani -ri nie zapewnia żadnego standardowego sposobu w żadnym poleceniu (o którym wiem), aby sformatować czas uniksowy z wiersza poleceń (ponieważ POSIX Awk również nie ma strftime()). (Nie możesz użyć touch -ti, lsponieważ ten pierwszy nie akceptuje czasu podanego w sekundach od Epoki Uniksa).

Należy jednak pamiętać, że The One True Awk dostępny bezpośrednio od Briana Kernighana ma teraz strftime()wbudowaną funkcję, a także systime()funkcję zwracania aktualnego czasu w sekundach od epoki Uniksa), więc być może rozwiązanie Awk jest najbardziej przenośne.

Greg A. Woods
źródło
4

Jeśli uznasz, że notacja jest niezręczna, być może -Ropcja -pomoże Ci pomóc. Wydaje datę w formacie RFC 2822. Więc nie trzeba będzie te wszystkie identyfikatory: date -d @1278999698 -R. Inną możliwością jest wyjście data w kilka sekund w danym regionie: date -d @1278999698 +%c. Powinien być łatwy do zapamiętania. :-)

qbi
źródło
2

Nieznaczna korekta powyższej odpowiedzi dabest1. Określ strefę czasową jako UTC, a nie GMT:

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

Drugi jest poprawny. Myślę, że powodem jest to, że w Wielkiej Brytanii czas letni obowiązywał nieprzerwanie od 1968 do 1971 roku.

Tony Mountifield
źródło
2

Standardowe rozwiązanie Perla to:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(lub czas lokalny, jeśli wolisz)

William Pursell
źródło
1
awk 'BEGIN { print strftime("%c", 1271603087); }'
Sjoerd
źródło
1

Inne przykłady tutaj są trudne do zapamiętania. W najprostszym przypadku:

date -r 1305712800
denmojo
źródło
Wyniki mieszane: nie działa w systemie Ubuntu Linux, ale działa na przykład w systemie Mac OS X.
Mike Q
1

Umieść w swoim ~ / .bashrc:

function unixts() { date -d "@$1"; }

Przykładowe użycie:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
Dangelov
źródło
-1

Pyton:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
Itachi
źródło