Jeg har et UNIX-tidsstempel, og jeg vil gerne have en formateret dato (som f.eks. output af date
) svarende til det tidsstempel.
Mine forsøg hidtil:
$ 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"
Jeg vil gerne være i stand til at få output som:
$ TZ=UTC somecommand 1282368345 Sat Aug 21 05:25:45 UTC 2010
Svar
På Mac OS X og BSD:
$ date -r 1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -r 1282368345 +%Y-%m-%d 2010-08-21
med GNU-kerneværktøjer (du skal grave gennem infofilen for det):
$ date -d @1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -d @1282368345 --rfc-3339=date 2010-08-21
Med enten tilføj -u
(standard) eller send en TZ=UTC0
miljøvariabel for at have UTC-datoen (TZ=UTC0
definerer en tidszone kaldet UTC
med forskydning 0 fra UTC mens adfærden for TZ=UTC
(uden forskydning) er uspecificeret (selvom de fleste systemer refererer til et systemdefineret tidszone kaldes også UTC
med offset 0 fra UTC)).
Kommentarer
- Det tager meget at grave, hvilket er overraskende for en sådan fælles opgave.
- Tak, accepteret dit svar. Jeg burde have læst
info coreutils date
lidt mere omhyggeligt. - Dette giver mig en lidt anden dato:
date -r 1447264553943
resultater iWed Dec 28 01:39:03 BRST 47831
, når det ' faktisk er11/11/2015, 3:55:53 PM GMT-2:00
. - @falmp: det fungerer, hvis du bruger sekunder i stedet for mikrosekunder.
- @hop ops, skulle have regnet med, at året var 47831, men det tal var så højt, at jeg savnede det. Tak!
Svar
Denne perl one-liner gør det:
$ perl -e "print scalar localtime $ARGV[0]" 1282367908 Sat Aug 21 09:18:28 2010
Svar
Efter noget googling fandt jeg måde at gøre det med date
kun kommando:
$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds" Sat Aug 21 09:18:28 MSD 2010
Kommentarer
Svar
Med shell-indbyggede:
-
zsh
(4.1.1 (2003) og derover):$ zmodload zsh/datetime $ TZ=UTC0 strftime %c 1282368345 Sat 21 Aug 2010 05:25:45 UTC
-
ksh93
(ksh93i
(2000) og derover):$ TZ=UTC0 printf "%(%c)T\n" "#1282368345" Sat Aug 21 05:25:45 2010
-
bash
(4.2 (2010) og derover):$ TZ=UTC0 printf "%(%c)T\n" 1282368345 Sat 21 Aug 2010 05:25:45 UTC
I alle disse skal du erstatte %c
med det ønskede strftime()
-format.
Kommentarer
- Har du en reference til
bash
printf
løsning? - Nevermind, jeg fandt den i beskrivelsen af
printf
i gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Svar
På osx, at have i UTC
date -r "1475737200" -u
Kommentarer
- Tak. Jeg ' har redigeret det i det accepterede svar, så oplysningerne er lettere tilgængelige.
Svar
Svar på et gammelt spørgsmål, men jeg tror, det kan være en forbedring, hvis nogen andre søger efter dette. Denne Bash-funktion fungerer på både Linux og OS X. Jeg har ikke testet på andre BSD-systemer. Send epoken som et argument til denne funktion, og den udskriver tidsformatet 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 }
Svar
Et andet pænt eksempel på den moderne Unix rige arv. Dette er faktisk muligt under de fleste BSD-varianter:
$ TZ=UTC date -r 1282368345 Sat Aug 21 05:25:45 UTC 2010
(BTW dit eksempel synes at være slukket med et sekund)
Kommentarer
- Fungerer ' ikke på Linux. hop ' s svar synes at have det korrekte Linux-svar. Tak for at påpege det, jeg formodede, at noget lignende ville ske, jeg ' har gjort det 45 sekunder nu.
date -d @xxx
blev ikke tilføjet før coreutils 5.3 i 2005. At ' hvordan du skulle gøre det før det.