Czy istnieje szybki, jednowierszowy sposób konwertowania znacznika czasu systemu Unix na datę z wiersza poleceń systemu Unix?
date
moż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?
bash
shell
unix
unix-timestamp
chimeracoder
źródło
źródło
Odpowiedzi:
Dzięki GNU
date
możesz:(Od: BASH: Konwertuj uniksowy znacznik czasu na datę )
W systemie OS X użyj
date -r
.Alternatywnie użyj
strftime()
. Nie jest dostępny bezpośrednio z powłoki, ale możesz uzyskać do niego dostęp przez gawk . Specyfikator%c
wyświetla sygnaturę czasową w sposób zależny od ustawień regionalnych.źródło
date -d @1278999698 +'%Y-%m-%d %H:%M:%S'
Gdzie liczba za@
to liczba w sekundachźródło
date -r 1278999698 +'%Y-%m-%d %H:%M:%S'
(GMT) lub po prostudate -r 1278999698
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.Jeśli korzystasz z komputera Mac, użyj:
Polecenie uzyskania epoki:
Podziękowania dla Anton: BASH: Convert Unix Timestamp to a Date
źródło
Jak @TomMcKenzie mówi w komentarzu do innej odpowiedzi,
date -r 123456789
jest 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.-d
Opcja na wielu rodzajach systemów oznacza coś zupełnie innego niż GNU datę za--date
rozszerzeniem. Niestety GNU Date nie interpretuje-r
tego samego, co inne implementacje. Więc niestety musisz wiedzieć, której wersjidate
używasz, a wiele starszychdate
poleceń Uniksa nie obsługuje żadnej z tych opcji.Co gorsza, POSIX
date
nie rozpoznaje-d
ani-r
i 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 mastrftime()
). (Nie możesz użyćtouch -t
i,ls
ponieważ 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żesystime()
funkcję zwracania aktualnego czasu w sekundach od epoki Uniksa), więc być może rozwiązanie Awk jest najbardziej przenośne.źródło
Jeśli uznasz, że notacja jest niezręczna, być może
-R
opcja -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. :-)źródło
Nieznaczna korekta powyższej odpowiedzi dabest1. Określ strefę czasową jako UTC, a nie GMT:
Drugi jest poprawny. Myślę, że powodem jest to, że w Wielkiej Brytanii czas letni obowiązywał nieprzerwanie od 1968 do 1971 roku.
źródło
Standardowe rozwiązanie Perla to:
(lub czas lokalny, jeśli wolisz)
źródło
źródło
Inne przykłady tutaj są trudne do zapamiętania. W najprostszym przypadku:
źródło
Umieść w swoim ~ / .bashrc:
Przykładowe użycie:
źródło
Pyton:
źródło