Cum pot obține o dată formatată pentru un timestamp UNIX din linia de comandă

Am un timestamp UNIX și aș dori să obțin o dată formatată (cum ar fi ieșirea date) corespunzătoare marcajului de timp respectiv.

Încercările mele de până acum:

$ 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" 

Mi-ar plăcea să pot obține rezultate precum:

$ TZ=UTC somecommand 1282368345 Sat Aug 21 05:25:45 UTC 2010 

Răspuns

Pe 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 

cu instrumentele de bază GNU (trebuie să căutați fișierul de informații pentru asta):

$ date -d @1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -d @1282368345 --rfc-3339=date 2010-08-21 

Cu oricare dintre acestea, adăugați opțiunea -u (standard) sau treceți un TZ=UTC0 variabilă de mediu pentru a avea data UTC (TZ=UTC0 definește un fus orar numit UTC cu offset 0 de la UTC în timp ce comportamentul pentru TZ=UTC (fără offset) este nespecificat (deși pe majoritatea sistemelor se referă la un sistem definit fusul orar numit și UTC cu offset 0 de la UTC)).

Comentarii

  • Este nevoie de mult totuși, de a săpa, ceea ce este surprinzător pentru o sarcină atât de comună.
  • Mulțumesc, v-am acceptat răspunsul. Ar fi trebuit să citesc info coreutils date puțin mai atent.
  • Acest lucru îmi oferă o dată ușor diferită: date -r 1447264553943 rezultate în Wed Dec 28 01:39:03 BRST 47831, când ' este de fapt 11/11/2015, 3:55:53 PM GMT-2:00.
  • @falmp: va funcționa dacă utilizați secunde în loc de microsecunde.
  • @hop ops, ar fi trebuit să se gândească cu anul 47831, dar numărul respectiv a fost atât de mare încât l-am ratat. Mulțumesc!

Răspuns

Acest perl one-liner o va face:

$ perl -e "print scalar localtime $ARGV[0]" 1282367908 Sat Aug 21 09:18:28 2010 

Răspuns

După câteva căutări, am găsit modalitatea de a o face cu date numai comandă:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds" Sat Aug 21 09:18:28 MSD 2010 

Comentarii

  • Vă mulțumim pentru asta. Speram că ' va fi ceva mai simplu, deci doar un vot sus pentru moment.
  • un alt exemplu excelent pentru modul în care Google te face prost. nu mai citește nimeni documentația?
  • @hop, suportul pentru date -d @xxx nu a fost adăugat până la coreutils 5.3 în 2005. Acel ' este modul în care trebuia să o faci înainte.
  • @St é phaneChazelas: a) acest răspuns este din 2010 și b) de ce face acest lucru scuzați Google înainte de a citi documentația? Dacă răspundeți din propria autoritate, vă puteți scuza să comiteți astfel de erori, dar dacă trebuie să îl căutați oricum, căutați-l bine.
  • @hop, am subliniat doar că nu este un răspuns stupid, doar unul învechit.

Răspuns

Cu shell built-in:

  • zsh (4.1.1 (2003) și mai sus):

    $ zmodload zsh/datetime $ TZ=UTC0 strftime %c 1282368345 Sat 21 Aug 2010 05:25:45 UTC 
  • ksh93 (ksh93i (2000) și mai sus):

    $ TZ=UTC0 printf "%(%c)T\n" "#1282368345" Sat Aug 21 05:25:45 2010 
  • bash (4.2 (2010) și mai sus):

    $ TZ=UTC0 printf "%(%c)T\n" 1282368345 Sat 21 Aug 2010 05:25:45 UTC 

În toate acestea, înlocuiți %c cu formatul strftime() pe care îl doriți.

Comentarii

Răspuns

Pe osx, a avea în UTC

date -r "1475737200" -u 

Comentarii

  • Mulțumesc. Am ' modificat în răspunsul acceptat, astfel încât informațiile să fie mai ușor disponibile.

Răspuns

Răspuns la o întrebare veche, dar cred că ar putea fi o îmbunătățire dacă altcineva caută acest lucru. Această funcție Bash funcționează atât pe Linux, cât și pe OS X. Nu am testat pe niciun alt sistem BSD. Treceți timpul de epocă ca argument pentru această funcție și va imprima formatul de timp 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 } 

Răspuns

Un alt exemplu îngrijit al bogatului patrimoniu al Unixului modern. Acest lucru este într-adevăr posibil în majoritatea variantelor BSD:

$ TZ=UTC date -r 1282368345 Sat Aug 21 05:25:45 UTC 2010 

(BTW exemplul dvs. pare să fie dezactivat cu o secundă)

Comentarii

  • Nu funcționează ' pe Linux. hop ' răspunsul pare să aibă răspunsul corect Linux. Vă mulțumim că ați subliniat acest lucru, am bănuit că se va întâmpla așa ceva, ' am reușit acum 45 de secunde.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *