Hoe kan ik een opgemaakte datum voor een UNIX-tijdstempel krijgen vanaf de opdrachtregel

Ik heb een UNIX-tijdstempel en ik “zou graag een opgemaakte datum willen krijgen (zoals de uitvoer van date) die overeenkomt met dat tijdstempel.

Mijn pogingen tot dusver:

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

Ik “zou graag output willen krijgen zoals:

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

Antwoord

Op Mac OS X en BSD:

$ date -r 1282368345 Sat Aug 21 07:25:45 CEST 2010 $ date -r 1282368345 +%Y-%m-%d 2010-08-21 

met GNU-kerntools (daarvoor moet je het informatiebestand doorzoeken):

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

Voeg met een van beide de -u (standaard) optie toe, of geef een TZ=UTC0 omgevingsvariabele om de UTC-datum te hebben (TZ=UTC0 definieert een tijdzone genaamd UTC met offset 0 van UTC terwijl het gedrag voor TZ=UTC (zonder offset) niet gespecificeerd is (hoewel op de meeste systemen zou verwijzen naar een door het systeem gedefinieerde tijdzone ook wel UTC genoemd met offset 0 van UTC)).

Reacties

  • Het kost veel van graven, wat verrassend is voor zon veel voorkomende taak.
  • Bedankt, accepteer je antwoord. Ik had info coreutils date wat zorgvuldiger moeten lezen.
  • Dit geeft me een iets andere datum: date -r 1447264553943 resultaten in Wed Dec 28 01:39:03 BRST 47831, wanneer het ' eigenlijk 11/11/2015, 3:55:53 PM GMT-2:00 is.
  • @falmp: het zal werken als je seconden gebruikt in plaats van microseconden.
  • @hop ops, had moeten rekenen met het jaar 47831, maar dat aantal was zo hoog dat ik het miste. Bedankt!

Answer

Deze perl one-liner zal het doen:

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

Antwoord

Na wat googelen vond ik een manier om het te doen met de date alleen commando:

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

Reacties

  • Bedankt daarvoor. Ik hoopte dat ' iets eenvoudiger zou zijn, dus voor nu even een stem omhoog.
  • nog een geweldig voorbeeld van hoe Google je stom maakt. leest niemand de documentatie ooit meer?
  • @hop, ondersteuning voor date -d @xxx werd niet toegevoegd tot coreutils 5.3 in 2005. Dat ' s hoe je het daarvoor moest doen.
  • @St é phaneChazelas: a) dit antwoord is uit 2010 en b) waarom doet dit excuus googlen voordat u de documentatie leest? Als je antwoordt vanuit je eigen autoriteit, kan je je excuses aanbieden als je zulke fouten maakt, maar als je het toch moet opzoeken, zoek het dan goed op.
  • @hop, ik wees er net op dat het niet zo was een stom antwoord, alleen een verouderd antwoord.

Antwoord

Met ingebouwde shell:

  • zsh (4.1.1 (2003) en hoger):

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

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

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

Vervang in al deze %c door de strftime() indeling die u wilt.

Reacties

Antwoord

Op osx, om in UTC te hebben

date -r "1475737200" -u 

Reacties

  • Bedankt. Ik ' heb dat in het geaccepteerde antwoord bewerkt, zodat de informatie gemakkelijker beschikbaar is.

Antwoord

Antwoord op een oude vraag, maar ik denk dat dit een verbetering kan zijn als iemand anders hiernaar zoekt. Deze Bash-functie werkt op zowel Linux als OS X. Ik heb niet getest op andere BSD-systemen. Geef de epoch-tijd als een argument door aan deze functie en het zal het RFC-3339-tijdformaat afdrukken.

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 } 

Answer

Nog een mooi voorbeeld van de rijke erfenis van de moderne Unix. Dit is inderdaad mogelijk onder de meeste BSD-varianten:

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

(Uw voorbeeld lijkt trouwens een seconde te verschillen)

Opmerkingen

  • Werkt niet ' op Linux. hop ' s antwoord lijkt het juiste Linux antwoord te hebben. Bedankt dat je erop hebt gewezen, ik vermoedde dat zoiets zou gebeuren, ik ' heb het nu 45 seconden gemaakt.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *