Jak przekonwertować znacznik czasu epoki na format czytelny dla człowieka na CLI? Myślę, że można to zrobić z datą, ale składnia mi umyka (inne sposoby są mile widziane).
Jak przekonwertować znacznik czasu epoki na format czytelny dla człowieka na CLI? Myślę, że można to zrobić z datą, ale składnia mi umyka (inne sposoby są mile widziane).
Odpowiedzi:
W dniu * BSD:
date -r 1234567890
W systemie Linux (w szczególności z GNU coreutils ≥5.3):
date -d @1234567890
W starszych wersjach daty GNU można obliczyć względną różnicę w stosunku do epoki UTC:
date -d '1970-01-01 UTC + 1234567890 seconds'
Jeśli potrzebujesz przenośności, nie masz szczęścia. Jedynym czasem, w którym można sformatować za pomocą polecenia powłoki POSIX (bez samodzielnego wykonywania obliczeń), jest bieżący czas. W praktyce Perl jest często dostępny:
perl -le 'print scalar localtime $ARGV[0]' 1234567890
@
znaczy date -d @1234567890
? man date
nie wspomniał o tym ...
info date
Jest dość kompletne. Wpis na 28.9 Seconds since the Epoch
szczegółowo wyjaśnia @timestamp.
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e'
Sun Sep 16 20:33:20 2007
Może się to przydać w przypadku aplikacji, które wykorzystują czas epoki w plikach dziennika:
$ 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 niestandardowy z GNU date
:
date -d @1234567890 +'%Y-%m-%d %H:%M:%S'
Lub z GNU awk
:
awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'
Połączone pytanie SO: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Z bash-4.2
lub powyżej:
printf '%(%F %T)T\n' 1234567890
(gdzie %F %T
jest strftime()
format -type)
Ta składnia jest inspirowana ksh93
.
W ksh93
Jednak argument przyjmuje się jako datę ekspresji gdzie obsługiwane są różne i trudno udokumentowane formaty.
Dla epoki uniksowej składnia w ksh93
:
printf '%(%F %T)T\n' '#1234567890'
ksh93
wydaje się jednak, że używa własnego algorytmu dla strefy czasowej i może go pomylić. Na przykład w Wielkiej Brytanii w 1970 r. Był czas letni, ale:
$ 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
Jeśli czas twojej epoki jest wyrażony w milisekundach zamiast sekund, usuń ostatnie trzy cyfry przed przekazaniem go do date -d
:
$ date -d @1455086371603
Tue Nov 7 02:46:43 PST 48079 #Incorrect
To daje nieprawidłowe dane. Usuń ostatnie trzy cyfry.
$ 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.
Dzięki zsh
możesz użyć strftime
wbudowanego:
format czasu strftime Podaj datę oznaczoną epoką w określonym formacie .
na przykład
zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
Piątek, 13 lutego 2009 r
Są też dateconv
z dateutils
:
dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Piątek, 13 lutego 2009 r
pamiętaj o dateutils
domyślnych narzędziach UTC
(dodaj w -z your/timezone
razie potrzeby).
Możesz także użyć małego programu C do wydrukowania daty i godziny w formacie, który może być bezpośrednio przeanalizowany przez powłokę
#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;
}
stosowanie:
#compile
clang -o epoch2datetime main.c
#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11
Nie byłoby prawdziwego rozwiązania bez małego node.js:
epoch2date(){
node -p "new Date($1)"
}
dodaj to ~/.bash_aliases
i upewnij się, że pochodzi ~/.bashrc
z. ~/.bash_aliases
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Aby pobrać węzeł w systemie, musisz http://nvm.sh i uruchomić polecenie curl. Zainstaluje menedżera wersji węzła (nvm), który pozwala przełączać wersje węzła.
Po prostu wpisz nvm ls-remote
i wybierz wersję do nvm install <version>
.
Jest na to łatwiejszy sposób: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")