web-dev-qa-db-fra.com

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

J'ai un horodatage UNIX et j'aimerais 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'

J'aimerais pouvoir obtenir une sortie comme:

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

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 GNU outils de base (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 l'un ou l'autre, ajoutez le -u (standard), ou passez une TZ=UTC0 variable d'environnement pour avoir la date UTC (TZ=UTC0définit un fuseau horaire appelé UTC avec le décalage 0 par rapport à UTC tandis que le comportement de TZ=UTC (sans décalage) n'est pas spécifié (bien que sur la plupart des systèmes se réfère à un fuseau horaire défini par le système également appelé UTC avec décalage 0 par rapport à UTC)).

98
user601

Cette doublure Perl le fera:

$ Perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
6
AlexD

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

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

Avec les fonctionnalités intégrées de Shell:

  • 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 plus):

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

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

Dans tous ceux-là, remplacez %c Par le format strftime() que vous voulez.

5

Répondez à une vieille question, mais je pense que cela pourrait être une amélioration si quelqu'un d'autre le recherche. Cette fonction Bash fonctionne à la fois sur Linux et OS X. Je n'ai testé sur aucun autre système BSD. Passez l'heure Epoch comme argument à cette fonction et elle imprimera le format d'heure 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
}
2
Noah Spurrier

Sur osx, avoir en UTC

date -r "1475737200" -u
2
anyone

Un autre bel exemple du riche héritage d'Unix 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 éteint d'une seconde)

1
codehead