Как я могу преобразовать метку времени эпохи в читаемый человеком формат на компьютере?

183

Как я могу преобразовать метку времени эпохи в читаемый человеком формат на компьютере? Я думаю, что есть способ сделать это с датой, но синтаксис ускользает от меня (другие способы приветствуются).

xenoterracide
источник

Ответы:

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 нет способа сделать это? Grr)
Ричард Хансен
3
Что @значит в date -d @1234567890? man dateне упомянул об этом ...
Крис Маркл
10
Справочные страницы @ChrisMarkle GNU часто ужасно неполны. «Формат строки даты более сложен, чем это легко документируется здесь, но полностью описан в информационной документации». Для примера: gnu.org/software/coreutils/manual/html_node/…
Жиль
2
Это info dateвполне завершено. Запись 28.9 Seconds since the Epochв подробно объясняет о @timestamp.
В Linux в трубе: дата + '% s' | xargs -Я n дата -d @n
Иван Огай
26

date -d @1190000000 Замените 1190000000 своей эпохой

fschmitt
источник
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()формат -type)

Этот синтаксис вдохновлен 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.
KnockTurnAl
источник
Какая утилита печатает включенные миллисекунды (без точки)?
Я видел, что сервер приложений WebLogic в основном возвращает значения времени данных в миллисекундах и без точек при использовании инструмента сценариев. например, lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl
Понимаю. Эта страница подтверждает значение необработанного времени. Отметка времени в миллисекундах . Благодарю.
Инструменты 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, в указанном формате .

например

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если необходимо).

don_crissti
источник
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>.

chovy
источник
0

Есть более простой способ сделать это: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) .ToString ("s")

Кульвиндер Сингх
источник
Добро пожаловать на U & L! Пожалуйста, взгляните на теги вопроса: работает ли этот код в какой-либо оболочке в какой-либо Unix или Unix-подобной системе?
Фра-сан
Этот метод использует Microsoft .NET. Не похоже, что OP ищет решение для MS.
user2320464