Jag har en UNIX-tidsstämpel och jag skulle vilja få ett formaterat datum (som utdata från date
) motsvarande den tidsstämpeln.
Mina försök hittills:
$ 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"
Jag skulle vilja kunna få utdata som:
$ TZ=UTC somecommand 1282368345 Sat Aug 21 05:25:45 UTC 2010
Svar
På Mac OS X och BSD:
$ date -r 1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -r 1282368345 +%Y-%m-%d 2010-08-21
med GNU-kärnverktyg (du måste gräva igenom infofilen för det):
$ date -d @1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -d @1282368345 --rfc-3339=date 2010-08-21
Med antingen lägger du till -u
(standard) eller skickar ett TZ=UTC0
miljövariabel för att ha UTC-datumet (TZ=UTC0
definierar en tidszon som heter UTC
med offset 0 från UTC medan beteendet för TZ=UTC
(utan förskjutning) är ospecificerat (men i de flesta system hänvisar det till ett systemdefinierat tidszon kallas även UTC
med offset 0 från UTC)).
Kommentarer
Svar
Denna perl-one-liner gör det:
$ perl -e "print scalar localtime $ARGV[0]" 1282367908 Sat Aug 21 09:18:28 2010
Svar
Efter lite googling hittade jag sätt att göra det med date
endast kommando:
$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds" Sat Aug 21 09:18:28 MSD 2010
Kommentarer
- Tack för det. Jag hoppades att det ' skulle vara något enklare, så bara en uppröstning för tillfället.
- ytterligare ett bra exempel på hur google gör dig dum. läser ingen någonsin dokumentationen längre?
- @hop, stöd för
date -d @xxx
lades inte förrän coreutils 5.3 2005. Att ' hur du var tvungen att göra det innan det. - @St é phaneChazelas: a) detta svar är från 2010 och b) varför gör detta ursäkta googla innan du läser dokumentationen? Om du svarar från din egen myndighet kan man ursäkta att göra fel som detta, men om du måste slå upp det ändå, slå upp det rätt.
- @hop, jag påpekade bara att det inte var ett dumt svar, bara ett föråldrat svar.
Svar
Med inbyggda skal:
-
zsh
(4.1.1 (2003) och senare):$ zmodload zsh/datetime $ TZ=UTC0 strftime %c 1282368345 Sat 21 Aug 2010 05:25:45 UTC
-
ksh93
(ksh93i
(2000) och senare):$ TZ=UTC0 printf "%(%c)T\n" "#1282368345" Sat Aug 21 05:25:45 2010
-
bash
(4.2 (2010) och senare):$ TZ=UTC0 printf "%(%c)T\n" 1282368345 Sat 21 Aug 2010 05:25:45 UTC
I alla dessa, ersätt %c
med strftime()
-formatet du vill ha.
Kommentarer
- Har du en referens för
bash
printf
lösning? - Nevermind, jag hittade den i beskrivningen av
printf
i gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Svar
På osx, att ha i UTC
date -r "1475737200" -u
Kommentarer
- Tack. Jag ' har redigerat det i det accepterade svaret så att informationen är lättare tillgänglig.
Svar
Svar på en gammal fråga, men jag tror att det kan vara en förbättring om någon annan söker efter detta. Denna Bash-funktion fungerar på både Linux och OS X. Jag har inte testat på några andra BSD-system. Skicka epoken som ett argument till den här funktionen så skrivs tidsformatet RFC-3339 ut.
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 }
Svar
Ett annat snyggt exempel på det rika arvet från modern Unix. Detta är verkligen möjligt under de flesta BSD-varianter:
$ TZ=UTC date -r 1282368345 Sat Aug 21 05:25:45 UTC 2010
(BTW ditt exempel verkar vara avstängt med en sekund)
Kommentarer
- Fungerar ' inte på Linux. hop ' s svar verkar ha rätt Linux-svar. Tack för att ni påpekade det, jag misstänkte att något sådant skulle hända, jag ' har gjort det 45 sekunder nu.
info coreutils date
lite mer noggrant.date -r 1447264553943
resultat iWed Dec 28 01:39:03 BRST 47831
, när det ' faktiskt11/11/2015, 3:55:53 PM GMT-2:00
.