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).
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
$ 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)
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
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.
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
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
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).
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
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>
.
Dans PowerShell :
(([System.DateTimeOffset]::FromUnixTimeMilliSeconds($unixtime)).DateTime).ToString("s")