web-dev-qa-db-fra.com

Convertir l'horodatage Unix en chaîne de date

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?

111
chimeracoder

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
151
John Kugelman

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Où le nombre derrière @ est le nombre en secondes

58
qbi

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

21
dabest1

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.

9
Greg A. Woods

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. :-)

4
qbi

D'autres exemples ici sont difficiles à retenir. Au plus simple:

date -r 1305712800
2
denmojo

La solution Perl standard est:

echo $TIMESTAMP | Perl -nE 'say scalar gmtime $_'

(ou heure locale, si vous préférez)

2
William Pursell

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.

2
Tony Mountifield
awk 'BEGIN { print strftime("%c", 1271603087); }'
1
Sjoerd

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
0
Dangelov