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
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=UTC0
dé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)).
Cette doublure Perl le fera:
$ Perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
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
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.
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
}
Sur osx, avoir en UTC
date -r "1475737200" -u
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)