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

60

J'ai un horodatage UNIX et j'aimerais obtenir une date formatée (comme la sortie de date) correspondant à cet horodatage.

Mes tentatives jusqu'ici:

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

J'aimerais pouvoir obtenir une sortie comme:

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

Réponses:

93

Sur 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 chercher dans le fichier d’information pour cela):

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

Ajoutez l’ -uoption (standard) ou transmettez une TZ=UTC0variable d’environnement afin d’avoir la date UTC ( TZ=UTC0 définit un fuseau horaire appelé UTCavec le décalage 0 de UTC, alors que le comportement de TZ=UTC(sans décalage) n’est pas spécifié (bien que, dans la plupart des systèmes, ce fuseau horaire défini par le système, également appelé UTCdécalage 0 par rapport à UTC)).

Stéphane Chazelas
la source
1
Cela prend cependant beaucoup de temps, ce qui est surprenant pour une tâche aussi commune.
David Z
Merci, accepté votre réponse. J'aurais dû lire info coreutils dateun peu plus attentivement.
Umang
Cela me donne une date légèrement différente: date -r 1447264553943résultats Wed Dec 28 01:39:03 BRST 47831, quand c'est en fait 11/11/2015, 3:55:53 PM GMT-2:00.
falmp
1
@falmp: cela fonctionnera si vous utilisez secondes au lieu de microsecondes.
@hop ops, aurait dû figurer avec l'année 47831, mais ce nombre était si élevé que je l'ai manqué. Merci!
falmp
6

Après quelques recherches sur Google, j'ai trouvé le moyen de le faire avec la datecommande uniquement:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
AlexD
la source
Merci pour ça. J'espérais qu'il y aurait quelque chose de plus simple, alors votez pour le moment.
Umang
un autre bon exemple de la façon dont Google vous rend stupide. personne ne lit-il plus la documentation?
1
@hop, le support pour date -d @xxxn'a pas été ajouté avant la version 5.3 de coreutils en 2005. C'est comme ça que vous deviez le faire avant.
Stéphane Chazelas
@ StéphaneChazelas: a) cette réponse date de 2010 et b) pourquoi cette excuse google-t-elle avant de lire la documentation? Si vous répondez de votre propre autorité, on peut prétendre que de telles erreurs sont commises, mais si vous devez quand même vérifier, vérifiez bien.
@hop, je faisais simplement remarquer que ce n'était pas une réponse stupide, mais une réponse obsolète.
Stéphane Chazelas
6

Ce perl one-liner le fera:

$ perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
AlexD
la source
5

Avec shell intégré:

  • zsh (4.1.1 (2003) et ci-dessus):

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

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    
  • bash (4.2 (2010) et ci-dessus):

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

Dans tous ceux-ci, remplacez %cpar le strftime()format que vous voulez.

Stéphane Chazelas
la source
Avez-vous une référence pour la bash printfsolution?
Derek Mahar
Peu importe , je l'ai trouvé dans la description de printfdans gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Derek Mahar
2

Sur osx, avoir en UTC

date -r "1475737200" -u
n'importe qui
la source
Merci. J'ai modifié cela dans la réponse acceptée pour que les informations soient plus facilement disponibles.
Stéphane Chazelas
1

Un autre bel exemple du riche héritage d'Unix moderne. Ceci est en effet possible dans la plupart des variantes de BSD:

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

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

tête de code
la source
Ne fonctionne pas sous Linux. La réponse de hop semble avoir la bonne réponse Linux. Merci de l'avoir signalé, je soupçonnais que quelque chose comme cela se produirait, je l'ai fait 45 secondes maintenant.
Umang
1

Répondez à une vieille question, mais je pense que cela pourrait être une amélioration si quelqu'un d'autre le cherchait. Cette fonction Bash fonctionne à la fois sous Linux et OS X. Je n'ai testé sur aucun autre système BSD. Passez l'heure comme argument de cette fonction et le format d'heure RFC-3339 sera imprimé.

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
}
Noah Spurrier
la source