Existe-t-il un moyen rapide et unique de convertir un horodatage Unix en une date à partir de la ligne de commande Unix?
date
pourrait fonctionner, sauf qu'il est assez délicat de spécifier chaque élément (mois, jour, année, heure, etc.) et que je ne vois pas comment le faire fonctionner correctement. Il semble y avoir un moyen plus facile - est-ce que je manque quelque chose?
Avec date
de GNU, vous pouvez faire:
date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969
(De: BASH: convertir l’horodatage Unix en date )
Sous OS X, utilisez date -r
.
date -r "$TIMESTAMP"
Vous pouvez également utiliser strftime()
. Il n'est pas disponible directement à partir du shell, mais vous pouvez y accéder via gawk . Le spécificateur %c
Affiche l'horodatage en fonction des paramètres régionaux.
echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST
date -d @1278999698 +'%Y-%m-%d %H:%M:%S'
Où le nombre derrière @
est le nombre en secondes
Cette solution fonctionne avec les versions de date qui ne prennent pas en charge date -d @
. Il ne nécessite pas AWK ou d'autres commandes. Un horodatage Unix est le nombre de secondes depuis le 1er janvier 1970, UTC, il est donc important de spécifier UTC.
date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012
Si vous êtes sur un Mac, utilisez:
date -r 1357004952
Commande pour obtenir Epoch:
date +%s
1357004952
Le crédit revient à Anton: BASH: convertir l’horodatage Unix en date
Comme @TomMcKenzie le dit dans un commentaire à une autre réponse, date -r 123456789
Est sans doute une solution simple plus courante (c'est-à-dire plus largement implémentée) pour des durées exprimées en secondes depuis l’époque Unix, mais il n’existe malheureusement pas de solution portable garantie universelle.
L'option -d
Sur de nombreux types de systèmes signifie quelque chose de totalement différent de l'extension GNU L'extension --date
De la date. Malheureusement GNU La date ne N'interprétez pas -r
de la même façon que ces autres implémentations. Donc, malheureusement, vous devez savoir quelle version de date
vous utilisez, et de nombreuses commandes plus anciennes Unix date
ne le font pas. soutenir l'une ou l'autre option.
Pire encore, POSIX date
ne reconnaît ni -d
Ni -r
Et ne fournit aucune manière standard dans aucune commande (à ma connaissance) de formater une heure Unix à partir de la ligne de commande (puisque POSIX Awk manque aussi de strftime()
). (Vous ne pouvez pas utiliser touch -t
Et ls
car le premier n'accepte pas une heure donnée en secondes depuis l'époque Unix.)
Notez que le One True Awk disponible directement auprès de Brian Kernighan a maintenant la fonction strftime()
intégrée ainsi qu'une fonction systime()
pour renvoyer l'heure actuelle en secondes depuis l'époque Unix) , alors peut-être que la solution Awk est la plus portable.
Si vous trouvez la notation difficile, peut-être que l'option -R
Vous aidera. Il affiche la date au format RFC 2822. Donc, vous n’avez pas besoin de tous ces identifiants: date -d @1278999698 -R
. Une autre possibilité consiste à afficher la date en secondes dans votre langue: date -d @1278999698 +%c
. Devrait être facile à retenir. :-)
D'autres exemples ici sont difficiles à retenir. Au plus simple:
date -r 1305712800
La solution Perl standard est:
echo $TIMESTAMP | Perl -nE 'say scalar gmtime $_'
(ou heure locale, si vous préférez)
Légère correction à la réponse de dabest1 ci-dessus. Spécifiez le fuseau horaire au format UTC et non GMT:
$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014
Le second est correct. Je pense que la raison en est qu’au Royaume-Uni, l’heure avancée était en vigueur de 1968 à 1971.
awk 'BEGIN { print strftime("%c", 1271603087); }'
Mettez ce qui suit dans votre ~/.bashrc:
function unixts() { date -d "@$1"; }
Exemple d'utilisation:
$ unixts 1551276383
Wed Feb 27 14:06:23 GMT 2019