2010-07-14 4 views
79

Existe-t-il un moyen rapide de convertir un horodatage Unix en une date à partir de la ligne de commande Unix? 'Date' peut fonctionner, sauf qu'il est plutôt difficile de spécifier chaque élément (mois, jour, année, heure, etc.), et je n'arrive pas à comprendre comment le faire fonctionner correctement. Il semble qu'il pourrait y avoir un moyen plus facile - ai-je oublié quelque chose?Convertir à partir de l'heure Unix sur la ligne de commande

+2

Quelle coque utilisez-vous? Frapper? Zsh? Tiret? –

+0

Bash - oublié de mentionner! – chimeracoder

+1

duplication possible de [Comment convertir les horodatages en dates dans bash?] (Http://stackoverflow.com/questions/2371248/how-to-convert-timestamps-to-dates-in-bash) – user

Répondre

106

Avec date de GNU, vous pouvez faire:

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

(De: BASH: Convert Unix Timestamp to a Date)

Sur 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 
1
awk 'BEGIN { print strftime("%c", 1271603087); }' 
49

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

+26

Sur OSX 10.8, il est 'date -r 1278999698 + '% Y-% m-% d% H:% M:% S'' (GMT) ou simplement' date -r 1278999698' –

4

Si vous trouvez la notation maladroite, peut-être le -R -option ne l'aide. Il sort la date au format RFC 2822. Vous n'aurez donc pas besoin de tous ces identifiants: date -d @1278999698 -R. Une autre possibilité consiste à afficher la date en secondes dans votre environnement local: date -d @1278999698 +%c. Devrait être facile à retenir. :-)

2

La solution standard de Perl est:

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

(ou localtime, si l'on préfère)

18

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 écoulées 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 époque:

date +%s 
1357004952 

Le crédit va à Anton: BASH: Convert Unix Timestamp to a Date

9

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

L'option -d sur de nombreux types de systèmes signifie quelque chose de complètement différent de l'extension --date de GNU Date. Malheureusement, la date GNU n'interprète pas -r de la même manière que ces autres implémentations. Donc, malheureusement, vous devez savoir quelle version de date vous utilisez, et beaucoup de vieilles commandes Unix date ne supportent aucune de ces options.

Pire encore, ne reconnaît ni date Posix -d ni -r et ne fournit aucun moyen standard dans toute commande du tout (que je sache) pour formater un temps Unix à partir de la ligne de commande (depuis awk POSIX manque aussi strftime()). (Vous ne pouvez pas utiliser touch -t et ls parce que le premier n'accepte pas un temps donné en secondes depuis l'époque Unix.)

Remarque si Le vrai Awk disponible directement de Brian Kernighan n'ont maintenant la fonction strftime() intégrée ainsi qu'une fonction systime() pour retourner l'heure actuelle en secondes depuis l'Epoque Unix), alors peut-être que la solution Awk est la plus portable.

1

Légère correction de la réponse de dabest1 ci-dessus. Indiquez le fuseau horaire en 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 

La seconde est correcte. Je pense que la raison en est qu'au Royaume-Uni, l'heure d'été était en vigueur de 1968 à 1971.

+0

Merci, j'ai mis à jour ma réponse. – dabest1

2

D'autres exemples sont difficiles à retenir. À son plus simple:

date -r 1305712800 
Questions connexes