Jak uzyskać sformatowaną datę dla znacznika czasu UNIX z wiersza poleceń

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

  • To zajmuje dużo kopania, co jest zaskakujące w przypadku tak powszechnego zadania.
  • Dzięki, przyjąłem twoją odpowiedź. Powinienem był przeczytać info coreutils date trochę dokładniej.
  • To daje mi nieco inną datę: date -r 1447264553943 wyniki w Wed Dec 28 01:39:03 BRST 47831, kiedy ' jest faktycznie 11/11/2015, 3:55:53 PM GMT-2:00.
  • @falmp: zadziała, jeśli użyjesz sekund zamiast mikrosekund.
  • @hop ops, powinien był obliczyć, że rok to 47831, ale ta liczba była tak wysoka, że ją przegapiłem. Dzięki!

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

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *