web-dev-qa-db-fra.com

Comment convertir un horodatage Epoch en un format lisible par l'homme sur la cli?

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

196
xenoterracide

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. La seule fois que vous pouvez formater avec une ligne de commande POSIX Shell (sans faire le calcul vous-même) est l'heure actuelle. En pratique, Perl est souvent disponible:

Perl -le 'print scalar localtime $ARGV[0]' 1234567890

date -d @1190000000 Remplacez 1190000000 par votre Epoch

28
fschmitt
$ 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 Epoch 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)
14
Stefan Lasiewski

Format personnalisé avec GNU date:

date -d @1234567890 +'%Y-%m-%d %H:%M:%S'

Ou avec GNU awk:

awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'

Lié SO question: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line

12
Ivan Chau

Si votre temps Epoch est en millisecondes au lieu de secondes, supprimez les trois derniers chiffres avant de le passer à 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.
12
KnockTurnAl

Avec bash-4.2 Ou supérieur:

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

(où %F %T est le format de type strftime())

Cette syntaxe est inspirée de ksh93.

Cependant, dans ksh93, L'argument est considéré comme une expression de date où des formats divers et à peine documentés sont pris en charge.

Pour une époque Unix, la syntaxe dans ksh93 Est:

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

ksh93 Semble cependant utiliser son propre algorithme pour le fuseau horaire et peut se tromper. Par exemple, en Grande-Bretagne, c'était l'heure d'été toute l'année en 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
11
Stéphane Chazelas

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
7
al.

Avec zsh vous pouvez utiliser la commande intégrée strftime :

strftime format epochtime
 
 Afficher la date indiquée par époque 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 dateconv de dateutils :

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

gardez à l'esprit dateutils outils par défaut à UTC (ajoutez -z your/timezone si besoin).

7
don_crissti

Vous pouvez également utiliser un petit programme C pour imprimer le datetime dans le format qui peut être directement analysé 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
0
Meow

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

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

ajoutez cela à ~/.bash_aliases et assurez-vous qu'il provient de ~/.bashrc avec . ~/.bash_aliases

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

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

Tapez simplement nvm ls-remote et choisissez une version pour nvm install <version>.

0
chovy

Dans PowerShell :

(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")
0
Kulwinder Singh