Como converter um carimbo de data / hora da época em um formato legível por humanos no CLI? Eu acho que existe uma maneira de fazer isso com a data, mas a sintaxe me escapa (outras formas são bem-vindas).
Como converter um carimbo de data / hora da época em um formato legível por humanos no CLI? Eu acho que existe uma maneira de fazer isso com a data, mas a sintaxe me escapa (outras formas são bem-vindas).
Respostas:
Em * BSD:
date -r 1234567890
No Linux (especificamente, com GNU coreutils ≥5.3):
date -d @1234567890
Com versões mais antigas da data GNU, você pode calcular a diferença relativa à época UTC:
date -d '1970-01-01 UTC + 1234567890 seconds'
Se você precisa de portabilidade, está sem sorte. A única hora em que você pode formatar com uma linha de comando do shell POSIX (sem fazer o cálculo sozinho) é a hora atual. Na prática, o Perl está frequentemente disponível:
perl -le 'print scalar localtime $ARGV[0]' 1234567890
@
significa isso date -d @1234567890
? man date
não fez nenhuma referência a isso ...
info date
é bastante completo. A entrada em 28.9 Seconds since the Epoch
explica em detalhes sobre o @timestamp.
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e'
Sun Sep 16 20:33:20 2007
Isso pode ser útil para os aplicativos que usam o tempo da época nos arquivos de log:
$ 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)
Formato personalizado com GNU date
:
date -d @1234567890 +'%Y-%m-%d %H:%M:%S'
Ou com o GNU awk
:
awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'
Pergunta SO vinculada: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Com bash-4.2
ou acima:
printf '%(%F %T)T\n' 1234567890
(onde %F %T
está o strftime()
formato -type)
Essa sintaxe é inspirada ksh93
.
No ksh93
entanto, o argumento é tomado como uma expressão de data em que vários formatos e dificilmente documentados são suportados.
Por um período de época Unix, a sintaxe ksh93
é:
printf '%(%F %T)T\n' '#1234567890'
ksh93
no entanto, parece usar seu próprio algoritmo para o fuso horário e pode errar. Por exemplo, na Grã-Bretanha, era verão o ano todo em 1970, mas:
$ 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
Se o tempo da época estiver em milissegundos em vez de segundos, remova os três últimos dígitos antes de passá-lo para date -d
:
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
Isso fornece dados incorretos. Remova os três últimos dígitos.
$ 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.
Com zsh
você pode usar o strftime
builtin:
strftime epochTime formato Produza a data indicada por epochtime no formato especificado.
por exemplo
zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Sexta-feira, 13 de fevereiro de 2009
Há também dateconv
de dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Sexta-feira, 13 de fevereiro de 2009
lembre-se de que as dateutils
ferramentas padrão são UTC
(adicione -z your/timezone
se necessário).
Você também pode usar um pequeno programa C para imprimir a data e hora no formato que pode ser analisado diretamente pelo 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;
}
uso:
#compile
clang -o epoch2datetime main.c
#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
Não seria uma solução real sem um pequeno node.js:
epoch2date(){
node -p "new Date($1)"
}
adicione isso ~/.bash_aliases
e verifique se ele é fornecido ~/.bashrc
com. ~/.bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Para obter o nó no seu sistema, vá para http://nvm.sh e execute o comando curl. Ele instalará o gerenciador de versão do nó (nvm), que permite alternar versões do nó.
Basta digitar nvm ls-remote
e escolher uma versão para nvm install <version>
.
Existe uma maneira mais fácil de fazer isso: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")