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).
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).
Réponses:
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
@
signifie date -d @1234567890
? man date
n'a fait aucune référence à cela ...
info date
est assez complet. L'entrée à 28.9 Seconds since the Epoch
explique en détail le @ horodatage.
$ 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)
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); }'
Question SO liée: https://stackoverflow.com/questions/3249827/convert-from-unom-time-at-command-line
Avec bash-4.2
ou au-dessus:
printf '%(%F %T)T\n' 1234567890
(où %F %T
est le strftime()
format -type)
Cette syntaxe est inspirée de ksh93
.
En ksh93
revanche, 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 ksh93
est la suivante:
printf '%(%F %T)T\n' '#1234567890'
ksh93
semble 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
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.
Avec zsh
vous, vous pouvez utiliser la fonction strftime
inté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 dateconv
de dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Vendredi 13 février 2009
garder à l'esprit les dateutils
outils par défaut à UTC
(ajouter -z your/timezone
si nécessaire).
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
Ne serait pas une vraie solution sans un petit noeud.js:
epoch2date(){
node -p "new Date($1)"
}
ajouter que ~/.bash_aliases
et assurez-vous que sa source ~/.bashrc
avec. ~/.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-remote
et choisir une version à nvm install <version>
.
Il existe un moyen plus simple de procéder: (([[System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")