Jak przekonwertować znacznik czasu epoki na format czytelny dla człowieka na CLI?


183

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:


268

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

4
+1 za komentarz na temat braku przenośności (dlaczego specyfikacja POSIX nie zawiera sposobu, aby to zrobić? Grr)
Richard Hansen 1'12

3
Co to @znaczy date -d @1234567890? man datenie wspomniał o tym ...
Chris Markle

10
@ChrisMarkle Strony podręcznika GNU są często żałośnie niepełne. „Format ciągu daty jest bardziej złożony, niż można go tutaj łatwo udokumentować, ale jest w pełni opisany w dokumentacji informacyjnej”. To znaczy
Gilles

2
info dateJest dość kompletne. Wpis na 28.9 Seconds since the Epochszczegółowo wyjaśnia @timestamp.

W systemie Linux w potoku: data + '% s' | xargs -I n date -d @n
Ivan Ogai


14
$ 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)


11

Z bash-4.2lub powyżej:

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

(gdzie %F %Tjest strftime()format -type)

Ta składnia jest inspirowana ksh93.

W ksh93Jednak 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'

ksh93wydaje 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

7

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.

Jakie wydruki użytkowe zawierały milisekundy (bez kropki)?

Widziałem, że serwer aplikacji WebLogic najczęściej zwraca wartości czasu danych w milisekundach i bez kropek podczas korzystania z narzędzia skryptowego. np. lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl

Widzę. Ta strona potwierdza nieprzetworzoną wartość czasu Datownik w milisekundach . Dzięki.

Narzędzia Atlassian rejestrują swoje znaczniki czasu jako epoki w milisekundach.
Br.Bill

6

Dwa, których często używam to:

$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009

i

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009

6

Dzięki zshmożesz użyć strftimewbudowanego:

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ż dateconvz dateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
Piątek, 13 lutego 2009 r

pamiętaj o dateutilsdomyślnych narzędziach UTC(dodaj w -z your/timezonerazie potrzeby).


0

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

0

Nie byłoby prawdziwego rozwiązania bez małego node.js:

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

dodaj to ~/.bash_aliasesi upewnij się, że pochodzi ~/.bashrcz. ~/.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-remotei wybierz wersję do nvm install <version>.


0

Jest na to łatwiejszy sposób: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")


Witamy w U&L! Proszę spojrzeć na tagi pytania: czy ten kod działa w niektórych powłokach w niektórych systemach uniksowych lub podobnych do unixa?
fra-san

Ta technika wykorzystuje Microsoft .NET. Nie wydaje się, że OP szuka rozwiązania MS.
user2320464
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.