Як перетворити часову позначку епохи в читаний для людини формат на кліпі?


183

Як перетворити часову позначку епохи в читаний для людини формат на кліпі? Я думаю, що є спосіб зробити це з датою, але синтаксис ухиляється від мене (інші способи вітаються).

Відповіді:


268

Увімкнено * BSD:

date -r 1234567890

У Linux (зокрема, з GNU coreutils ≥5.3):

date -d @1234567890

За старими версіями дати GNU можна обчислити відносну різницю до епохи UTC:

date -d '1970-01-01 UTC + 1234567890 seconds'

Якщо вам потрібна портативність, вам не пощастить. Єдиний раз, коли ви можете форматувати за допомогою команди оболонки POSIX (не роблячи обчислення самостійно) - це поточний час. На практиці Perl часто доступний:

perl -le 'print scalar localtime $ARGV[0]' 1234567890

4
+1 за коментар про відсутність переносимості (чому специфікація POSIX не містить способу зробити це? Грр)
Річард Хансен

3
Що @означає date -d @1234567890? man dateне посилався на це ...
Кріс Маркл

10
@ChrisMarkle GNU сторінки людини часто жахливо неповні. "Формат рядка дати складніший, ніж легко задокументований тут, але повністю описаний в інформаційній документації". До речі
Gilles

2
info dateДосить повно. Запис 28.9 Seconds since the Epochу докладно пояснює @timestamp.

У Linux в трубі: дата + '% s' | xargs -I n date -d @n
Іван Огай

26

date -d @1190000000 Замініть 1190000000 своєю епохою


8
Якщо припустити дату GNU, тобто.
Жиль

14
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e' 
Sun Sep 16 20:33:20 2007

Це може стати в нагоді тим програмам, які використовують епохальний час у журналах:

$ 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

З bash-4.2або вище:

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

(Де %F %Tце strftime()формат-типу)

Цей синтаксис натхненний ksh93.

В ksh93однак, аргумент сприймається як вираз дати , коли різні і навряд чи документовані формати підтримуються.

У епоху Unix синтаксис у ksh93:

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

ksh93однак, схоже, використовується власний алгоритм для часового поясу і може помилитися з ним. Наприклад, у Британії був літній час у цілому році в 1970 році, але:

$ 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

Якщо час вашої епохи замість секунд становить мілісекунди, видаліть три останні цифри, перш ніж передати її date -d:

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect

Це дає невірні дані. Видаліть останні три цифри.

$ 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.

Які відбитки утиліти включали мілісекунди (без крапки)?

Я бачив, що сервер WebLogic Application в основному повертає значення часу даних з мілісекундами і без крапок при використанні інструмента сценарію. наприклад, lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl

Я бачу. Ця сторінка підтверджує значення Raw Time Value - мітка часу в мілісекундах . Дякую.

Інструменти Atlassian фіксують свої часові позначки як епохальний час з мілісекундами.
Br.Bill

6

Два, якими я часто користуюся, є:

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

і

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

6

З zshвами можна використовувати strftimeвбудований:

STRFTIME формат epochtime

      Виведіть дату, позначену epochtime, у вказаному форматі .

напр

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
П’ятниця, 13 лютого 2009 року

Там також dateconvвід dateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
П’ятниця, 13 лютого 2009 року

майте на увазі dateutilsінструменти за замовчуванням до UTC(додайте, -z your/timezoneякщо потрібно).


0

Ви також можете використати невелику програму C для друку часу в форматі, який можна безпосередньо проаналізувати за оболонкою

#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;
}

використання:

#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

Не було б справжнім рішенням без невеликого node.js:

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

додати , що ~/.bash_aliasesі переконайтеся , що його джерела в ~/.bashrcс. ~/.bash_aliases

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Щоб отримати вузол у вашій системі, перейдіть на сторінку http://nvm.sh та запустіть команду curl. Він встановить диспетчер версій вузла (nvm), який дозволяє перемикати версії вузла.

Просто введіть nvm ls-remoteі виберіть версію для nvm install <version>.


0

Існує простіший спосіб зробити це: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")


Ласкаво просимо на U&L! Будь ласка, погляньте на теги питання: чи працює цей код у якійсь оболонці на якійсь Unix чи Unix-подібній системі?
фра-сан

Ця методика використовує Microsoft .NET. Здається, ОП не шукає рішення для MS.
користувач2320464
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.