Convertir l'horodatage Unix en chaîne de date

128

Existe-t-il un moyen rapide et unique de convertir un horodatage Unix en une date à partir de la ligne de commande Unix?

datepourrait fonctionner, sauf qu'il est plutôt difficile de spécifier chaque élément (mois, jour, année, heure, etc.), et je ne peux pas comprendre comment le faire fonctionner correctement. Il semble qu'il y ait un moyen plus simple - est-ce que je manque quelque chose?

chimère
la source
1
duplication possible de Comment convertir des horodatages en dates dans bash?
utilisateur

Réponses:

181

Avec GNU, datevous 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"

Sinon, utilisez strftime(). Il n'est pas disponible directement depuis le shell, mais vous pouvez y accéder via gawk . Le %cspécificateur 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
John Kugelman
la source
3
Assurez-vous d'éliminer les millisecondes de l'horodatage (c'est-à-dire seulement 10 chiffres au lieu de 13), sinon vous obtiendrez des résultats non valides (cela est vrai pour la date de macOS).
emerino
Je pensais que cela ne fonctionnait pas, jusqu'à ce que je réalise que j'avais un horodatage en millisecondes. Coupez les 3 derniers chiffres et vous obtenez l'heure exacte
Stewart
64

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

qbi
la source
28
Sur OSX 10.8, c'est date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) ou simplementdate -r 1278999698
Tom McKenzie
Fonctionne pour Ubuntu 16.04
Mike Q
24

Cette solution fonctionne avec des 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 l'époque:

date +%s
1357004952

Le crédit revient à Anton: BASH: Convertir l'horodatage Unix en date

dabest1
la source
10

Comme le dit @TomMcKenzie dans un commentaire sur une autre réponse, date -r 123456789est sans doute une solution simple plus courante (c'est-à-dire plus largement implémentée) pour les temps donnés en secondes depuis l'époque Unix, mais malheureusement, il n'y a pas de solution portable garantie universelle.

L' -doption sur de nombreux types de systèmes signifie quelque chose de complètement différent de l' --dateextension GNU Date . Malheureusement, GNU Date n'interprète pas -rla même chose que ces autres implémentations. Donc, malheureusement, vous devez savoir quelle version de datevous utilisez, et de nombreuses datecommandes Unix plus anciennes ne prennent en charge aucune de ces options.

Pire encore, POSIX datene reconnaît -dni -ret ne fournit aucun moyen standard dans aucune commande (à ma connaissance) de formater une heure Unix à partir de la ligne de commande (puisque POSIX Awk manque également strftime()). (Vous ne pouvez pas utiliser touch -tet lsparce que le premier n'accepte pas un temps donné en secondes depuis l'époque Unix.)

Notez bien que The One True Awk disponible directement auprès de Brian Kernighan a maintenant la strftime()fonction intégrée ainsi qu'une systime()fonction pour renvoyer l'heure actuelle en secondes depuis l'époque Unix), donc peut-être que la solution Awk est la plus portable.

Greg A. Woods
la source
4

Si vous trouvez la notation gênante, peut-être que l' -Roption-vous aide. Il dépasse la date au format RFC 2822. Ainsi , vous aurez pas besoin de tous ces identifiants: date -d @1278999698 -R. Une autre possibilité est de la date de sortie en quelques secondes dans votre région: date -d @1278999698 +%c. Cela devrait être facile à retenir. :-)

qbi
la source
2

Légère correction de la réponse de dabest1 ci-dessus. Spécifiez le fuseau horaire comme UTC, pas 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 d'été était en vigueur de 1968 à 1971.

Tony Mountifield
la source
2

La solution standard de Perl est:

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

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

William Pursell
la source
1
awk 'BEGIN { print strftime("%c", 1271603087); }'
Sjoerd
la source
1

D'autres exemples ici sont difficiles à retenir. Dans sa plus simple expression:

date -r 1305712800
Denmojo
la source
Résultats mitigés: ne fonctionne pas sous Ubuntu Linux mais fonctionne sous Mac OS X par exemple.
Mike Q
1

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
Dangelov
la source
-1

Python:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
Itachi
la source