Mam znacznik czasu UNIX i chcę uzyskać sformatowaną datę (np. wynik date
) odpowiadający tej sygnaturze czasowej.
Moje dotychczasowe próby:
$ date +%s 1282367908 $ date -d 1282367908 date: invalid date `1282367908" $ date -d +1282367908 date: invalid date `+1282367908" $ date +%s -d +1282367908 date: invalid date `+1282367908"
Chciałbym móc uzyskać takie wyniki, jak:
$ TZ=UTC somecommand 1282368345 Sat Aug 21 05:25:45 UTC 2010
Odpowiedź
W systemie Mac OS X i BSD:
$ date -r 1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -r 1282368345 +%Y-%m-%d 2010-08-21
z podstawowymi narzędziami GNU (w tym celu musisz przeszukać plik informacyjny):
$ date -d @1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -d @1282368345 --rfc-3339=date 2010-08-21
W jednym z nich dodaj opcję -u
(standard) lub przekaż TZ=UTC0
zmienna środowiskowa z datą UTC (TZ=UTC0
definiuje strefę czasową o nazwie UTC
z przesunięciem 0 względem czasu UTC podczas gdy zachowanie dla TZ=UTC
(bez przesunięcia) jest nieokreślone (chociaż w większości systemów odnosiłoby się do zdefiniowanego przez system strefa czasowa zwana także UTC
z przesunięciem 0 względem czasu UTC)).
Komentarze
Odpowiedź
Ta jedna linijka perla to zrobi:
$ perl -e "print scalar localtime $ARGV[0]" 1282367908 Sat Aug 21 09:18:28 2010
Odpowiedź
Po pewnym googlowaniu znalazłem sposób na zrobienie tego z date
tylko polecenie:
$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds" Sat Aug 21 09:18:28 MSD 2010
Komentarze
- Dziękuję za to. Miałem nadzieję, że ' będzie coś prostszego, więc na razie tylko głos w górę.
- kolejny świetny przykład tego, jak Google sprawia, że jesteś głupi. czy nikt już nie czyta dokumentacji?
- @hop, obsługa
date -d @xxx
nie została dodana do coreutils 5.3 w 2005 roku. To ' jak to było wcześniej. - @St é phaneChazelas: a) ta odpowiedź pochodzi z 2010 r. oraz b) dlaczego tak się dzieje przepraszam googlowanie przed przeczytaniem dokumentacji? Jeśli odpowiadasz z własnego autorytetu, można usprawiedliwić popełnienie takich błędów, ale jeśli i tak musisz to sprawdzić, spójrz dobrze.
- @hop, po prostu wskazałem, że to nie głupia odpowiedź, tylko nieaktualna.
Odpowiedź
Z wbudowanymi elementami powłoki:
-
zsh
(4.1.1 (2003) i nowsze):$ zmodload zsh/datetime $ TZ=UTC0 strftime %c 1282368345 Sat 21 Aug 2010 05:25:45 UTC
-
ksh93
(ksh93i
(2000) i nowsze):$ TZ=UTC0 printf "%(%c)T\n" "#1282368345" Sat Aug 21 05:25:45 2010
-
bash
(4.2 (2010) i nowsze):$ TZ=UTC0 printf "%(%c)T\n" 1282368345 Sat 21 Aug 2010 05:25:45 UTC
W tych wszystkich zamień %c
na wybrany format strftime()
.
Komentarze
- Czy masz odniesienie do
bash
printf
rozwiązanie? - Nieważne, znalazłem je w opisie
printf
w gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Odpowiedź
Na osx, czas UTC
date -r "1475737200" -u
Komentarze
- Dzięki. ' zredagowałem to w zaakceptowanej odpowiedzi, aby informacje były łatwiej dostępne.
Odpowiedź
Odpowiedz na stare pytanie, ale myślę, że może to być poprawa, jeśli ktoś inny szuka tego. Ta funkcja Bash działa zarówno w systemie Linux, jak i OS X. Nie testowałem na żadnym innym systemie BSD. Przekaż czas epoki jako argument do tej funkcji, a wydrukuje ona format czasu RFC-3339.
epochtorfc3339 () { RFC3339_FORMAT="+%FT%T:::%z" EPOCH=$(echo $@ | sed -n "s/.*\([0-9]\{10\}\).*/\1/p"); if date --version >/dev/null 2>/dev/null; then # Linux date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${EPOCH} seconds" #date -d @${EPOCH} --rfc-3339=seconds else # OS X/BSD date -r ${EPOCH} ${RFC3339_FORMAT} fi }
Odpowiedź
Kolejny zgrabny przykład bogatego dziedzictwa współczesnego Uniksa. Jest to rzeczywiście możliwe w przypadku większości wariantów BSD:
$ TZ=UTC date -r 1282368345 Sat Aug 21 05:25:45 UTC 2010
(Przy okazji, twój przykład wydaje się być przesunięty o jedną sekundę)
Komentarze
- Nie ' nie działa w systemie Linux. Odpowiedź hop ' wydaje się zawierać poprawną odpowiedź w systemie Linux. Dziękuję za zwrócenie uwagi. Podejrzewałem, że coś takiego się wydarzy, ' zrobiłem to teraz 45 sekund.
info coreutils date
trochę dokładniej.date -r 1447264553943
wyniki wWed Dec 28 01:39:03 BRST 47831
, kiedy ' jest faktycznie11/11/2015, 3:55:53 PM GMT-2:00
.