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?


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

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


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


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.


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. :-)


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.


2

Standardowe rozwiązanie Perla to:

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

(lub czas lokalny, jeśli wolisz)



1

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

date -r 1305712800

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

-1

Pyton:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
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.