144 votes

Convertir de unixtime à la ligne de commande

Est-il rapide, une ligne de chemin de convertir un timestamp unix d'une date à partir de la ligne de commande unix?

J'ai cherché à travers les autres postes, et la plupart semblent être un moyen de les convertir dans le contexte d'une langue particulière, ou pour convertir datestrings en unixtime. Je suis à la recherche d'un moyen de faire l'inverse à la ligne de commande.

'Date' pourrait fonctionner, sauf que c'est plutôt difficile à définir chaque élément (jour, mois, année, heure, etc), et je ne peux pas comprendre comment le faire fonctionner correctement. Il semble comme il pourrait y avoir un moyen plus facile, suis-je raté quelque chose?

204voto

John Kugelman Points 108754

Vous pouvez utiliser strftime() au format UNIX horodateurs. Il n'est pas disponible directement depuis le shell, mais on peut y accéder via gawk. L' %c spécificateur affiche l'horodatage dans les paramètres régionaux de manière dépendante.

echo $TIMESTAMP | gawk '{print strftime("%c", $0)}'

# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST

Aussi, date a plus simple, mais pas largement pris en charge la syntaxe:

date -d @$TIMESTAMP

# date -d @0
Wed Dec 31 19:00:00 EST 1969

(À partir de: BASH: Convertir le Timestamp Unix d'une Date)

72voto

qbi Points 793

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

26voto

dabest1 Points 421

Cette solution fonctionne avec les versions de date qui ne supportent pas l' date -d @. Ne nécessite pas de awk ou d'autres commandes. Un timestamp unix est le nombre de secondes depuis le 1er janvier 1970, GMT donc il est important de préciser GMT.

date -d '1970-01-01 1357004952 sec GMT'
Mon Dec 31 17:49:12 PST 2012

Commande pour obtenir de l'époque:

date +%s
1357004952

Le crédit va à Anton sur ce site: http://anton.lr2.com/2006/04/06/convert-a-unix-epoch-timestamp-to-a-date-in-bash/

10voto

Greg A. Woods Points 683

@TomMcKenzie dit dans un commentaire à une autre réponse, date -r 123456789 est sans doute plus ordinaires (c'est à dire plus largement mises en œuvre), la solution la plus simple pour un temps donné en secondes depuis l'Époque Unix, mais malheureusement il n'y a pas d'universel garanti solution portable.

L' -d option sur de nombreux types de systèmes signifie quelque chose de totalement différent de GNU Date de l' --date extension. Malheureusement GNU Date n'a pas interpréter -r le même que ces autres implémentations. Donc, malheureusement, vous devez savoir quelle est la version de date vous utilisez, et beaucoup de vieux Unix date commandes ne prennent pas en charge une ou l'autre option.

Pire encore, POSIX date reconnaît ni -d ni -r et prévoit pas de manière standard dans n'importe quelle commande à tous (que je connais) pour formater un temps Unix en ligne de commande (depuis POSIX Awk manque également de l' strftime()). (Vous ne pouvez pas utiliser touch -t et ls parce que l'ancien ne pas accepter un temps donné en secondes depuis l'Époque Unix.)

Notez bien que Le seul Vrai Awk disponible directement à partir de Brian Kernighan n'ont maintenant l' strftime() fonction intégrée ainsi que d'un systime() fonction retourne le temps en secondes depuis l'Époque Unix), donc peut-être le Awk solution est la plus portable.

4voto

qbi Points 793

Si vous trouvez la notation maladroit, peut-être l' -R-option aide. Il outpouts la date au format RFC 2822. Donc vous n'aurez pas besoin de toutes ces identifiants: date -d @1278999698 -R. Une autre possibilité est de sortie la date en secondes en fonction de vos paramètres régionaux: date -d @1278999698 +%c. Doit être facile à retenir. :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X