Comment convertir un horodatage d'époque en un format lisible par l'homme sur la cli?

183

Comment convertir un horodatage d'époque en un format lisible par l'homme sur la cli? Je pense qu'il y a un moyen de le faire avec date mais la syntaxe m'échappe (d'autres moyens sont les bienvenus).

xénoterracide
la source

Réponses:

268

Sur * BSD:

date -r 1234567890

Sous Linux (en particulier avec GNU coreutils ≥5.3):

date -d @1234567890

Avec les anciennes versions de GNU date, vous pouvez calculer la différence relative par rapport à l’époque UTC:

date -d '1970-01-01 UTC + 1234567890 seconds'

Si vous avez besoin de portabilité, vous n'avez pas de chance. Le seul moment où vous pouvez formater avec une commande shell POSIX (sans effectuer vous-même le calcul) est l’heure actuelle. En pratique, Perl est souvent disponible:

perl -le 'print scalar localtime $ARGV[0]' 1234567890
Gilles
la source
4
+1 pour le commentaire sur le manque de portabilité (pourquoi la spécification POSIX n'inclut-elle pas un moyen de le faire? Grr)
Richard Hansen
3
Qu'est-ce que cela @signifie date -d @1234567890? man daten'a fait aucune référence à cela ...
Chris Markle
10
@ChrisMarkle Les pages de manuel GNU sont souvent incomplètes. « Le format de chaîne de date est plus complexe que ce qui est facilement documentée ici , mais est décrit en détail dans la documentation d'information. » A savoir: gnu.org/software/coreutils/manual/html_node/...
Gilles
2
Le info dateest assez complet. L'entrée à 28.9 Seconds since the Epochexplique en détail le @ horodatage.
Sous Linux dans un tuyau: date + '% s' | xargs -I n date -d @n
Ivan Ogai
26

date -d @1190000000 Remplacez 1190000000 par votre époque

fschmitt
la source
8
En supposant que la date GNU, c’est.
Gilles
14
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e' 
Sun Sep 16 20:33:20 2007

Cela peut être utile pour les applications qui utilisent le temps de génération dans les fichiers journaux:

$ tail -f /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime($1)/e'
[Thu May 13 10:15:46 2010] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;HOSTA;check_raid;0;check_raid.pl: OK (Unit 0 on Controller 0 is OK)
Stefan Lasiewski
la source
11

Avec bash-4.2ou au-dessus:

printf '%(%F %T)T\n' 1234567890

(où %F %Test le strftime()format -type)

Cette syntaxe est inspirée de ksh93.

En ksh93revanche, l'argument est considéré comme une expression de la date où les formats différents et à peine documentés sont pris en charge.

Pour une époque Unix, la syntaxe ksh93est la suivante:

printf '%(%F %T)T\n' '#1234567890'

ksh93semble toutefois utiliser son propre algorithme pour le fuseau horaire et peut se tromper. Par exemple, en Grande-Bretagne, c'était l'été toute l'année 1970, mais:

$ TZ=Europe/London bash -c 'printf "%(%c)T\n" 0'
Thu 01 Jan 1970 01:00:00 BST
$ TZ=Europe/London ksh93 -c 'printf "%(%c)T\n" "#0"'
Thu Jan  1 00:00:00 1970
Stéphane Chazelas
la source
7

Si votre époque est en millisecondes au lieu de secondes, supprimez les trois derniers chiffres avant de la transmettre à date -d:

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect

Cela donne des données incorrectes. Supprimez les trois derniers chiffres.

$ date -d @1455086371
Tue Feb  9 22:39:31 PST 2016      #Correct after removing the last three digits. You may remove and round off the last digit too.
KnockTurnAl
la source
Quel utilitaire imprime millisecondes inclus (sans un point)?
J'ai vu que le serveur d'applications WebLogic renvoie principalement des valeurs de temps de données avec des millisecondes et aucun point lorsque vous utilisez un outil de script. Par exemple, lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl 10/02/2016
Les outils Atlassian enregistrent leurs horodatages en fonction du temps, en millisecondes.
Br.Bill
6

Les deux que j'utilise fréquemment sont:

$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009

et

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
Al.
la source
6

Avec zshvous, vous pouvez utiliser la fonction strftimeintégrée:

strftime Format epochtime
Affiche 
      la date indiquée par epochtime dans le format spécifié.

par exemple

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Vendredi 13 février 2009

Il y a aussi dateconvde dateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Vendredi 13 février 2009

garder à l'esprit les dateutilsoutils par défaut à UTC(ajouter -z your/timezonesi nécessaire).

don_crissti
la source
0

Vous pouvez également utiliser un petit programme en C pour imprimer la date et l'heure dans un format pouvant être analysé directement par shell

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(int argc, char * argv[]) {

    if (argc==1) { 
        return 1;
    }

    struct tm input_tm;
    char * formatStr  = "YEAR=%Y\nMON=%m\nDAY=%d\nHOUR=%H\nMIN=%M\nSEC=%S";
    size_t formatSize = strlen(formatStr) + 2;
    char * output     = (char *)malloc(sizeof(char)*formatSize);

    strptime(argv[1],"%s",&input_tm);
    strftime(output, formatSize, formatStr, &input_tm);

    printf("%s\n",output);
    free(output);
    return 0;
}

usage:

#compile
clang -o epoch2datetime main.c

#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
Miaou
la source
0

Ne serait pas une vraie solution sans un petit noeud.js:

epoch2date(){
    node -p "new Date($1)"
}

ajouter que ~/.bash_aliaseset assurez-vous que sa source ~/.bashrcavec. ~/.bash_aliases

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Pour obtenir le nœud sur votre système, accédez à http://nvm.sh et exécutez la commande curl. Il va installer le gestionnaire de version de noeud (nvm) qui vous permet de changer de version de noeud.

Il suffit de taper nvm ls-remoteet choisir une version à nvm install <version>.

chovy
la source
0

Il existe un moyen plus simple de procéder: (([[System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")

Kulwinder Singh
la source
Bienvenue sur U & L! Veuillez regarder les balises de la question: ce code fonctionne-t-il dans un shell sur un système Unix ou similaire à Unix?
fra-san
Cette technique utilise Microsoft .NET. Il semble que OP ne cherche pas de solution MS.
user2320464