Comment puis-je obtenir une date formatée pour un horodatage UNIX à partir de la ligne de commande

Jai un horodatage UNIX et jaimerais obtenir une date formatée (comme la sortie de date) correspondant à cet horodatage.

Mes tentatives jusquà présent:

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

Je « voudrais pouvoir obtenir un résultat comme:

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

Réponse

Sous Mac OS X et BSD:

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

avec les outils de base GNU (vous devez fouiller dans le fichier info pour cela):

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

Avec lun ou lautre, ajoutez loption -u (standard) ou passez une TZ=UTC0 variable denvironnement pour avoir la date UTC (TZ=UTC0 définit un fuseau horaire appelé UTC avec un décalage de 0 par rapport à UTC tandis que le comportement de TZ=UTC (sans décalage) nest pas spécifié (bien que sur la plupart des systèmes il se réfère à un système défini fuseau horaire également appelé UTC avec décalage 0 par rapport à UTC)).

Commentaires

  • Cela prend beaucoup de creuser, cependant, ce qui est surprenant pour une tâche aussi courante.
  • Merci, jai accepté votre réponse. Jaurais dû lire info coreutils date un peu plus attentivement.
  • Cela me donne une date légèrement différente: date -r 1447264553943 résultats dans Wed Dec 28 01:39:03 BRST 47831, lorsque ' est en fait 11/11/2015, 3:55:53 PM GMT-2:00.
  • @falmp: cela fonctionnera si vous utilisez des secondes au lieu de microsecondes.
  • @hop ops, aurait dû figurer avec lannée 47831, mais ce nombre était si élevé que je lai manqué. Merci!

Réponse

Ce one-liner perl le fera:

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

Réponse

Après quelques recherches sur Google, jai trouvé un moyen de le faire avec le date commande uniquement:

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

Commentaires

  • Merci pour cela. Jespérais que ' serait quelque chose de plus simple, donc juste un vote pour linstant.
  • un autre excellent exemple de la façon dont Google vous rend stupide. personne ne lit plus la documentation?
  • @hop, la prise en charge de date -d @xxx na été ajoutée quà coreutils 5.3 en 2005. Cela ' est comment vous deviez le faire avant cela.
  • @St é phaneChazelas: a) cette réponse date de 2010 et b) pourquoi cela excuser googler avant de lire la documentation? Si vous répondez de votre propre autorité, on peut excuser de faire des erreurs comme celle-ci, mais si vous devez quand même le rechercher, cherchez-le correctement.
  • @hop, je voulais juste souligner que ce nétait pas une réponse stupide, juste une réponse obsolète.

Réponse

Avec le shell intégré:

  • zsh (4.1.1 (2003) et plus):

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

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

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

Dans tous ceux-ci, remplacez %c par le format strftime() souhaité.

Commentaires

Réponse

Sur osx, pour avoir en UTC

date -r "1475737200" -u 

Commentaires

  • Merci. Jai ' modifié cela dans la réponse acceptée afin que les informations soient plus facilement disponibles.

Réponse

Répondez à une vieille question, mais je pense que cela pourrait être une amélioration si quelquun dautre le recherche. Cette fonction Bash fonctionne à la fois sous Linux et OS X. Je nai testé sur aucun autre système BSD. Passez lheure de lépoque comme argument à cette fonction et elle affichera le format dheure 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éponse

Un autre exemple intéressant du riche héritage dUnix moderne. Ceci est en effet possible sous la plupart des variantes BSD:

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

(BTW votre exemple semble être décalé dune seconde)

Commentaires

  • Ne fonctionne pas ' sous Linux. La réponse de hop ' semble avoir la bonne réponse Linux. Merci de lavoir signalé, je soupçonnais que quelque chose de ce genre se produirait, ' jai réussi 45 secondes maintenant.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *