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

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

139 голосов | спросил xenoterracide 11 +04002010-10-11T17:46:12+04:00312010bEurope/MoscowMon, 11 Oct 2010 17:46:12 +0400 2010, 17:46:12

11 ответов


205

Вкл. * 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
ответил Gilles 11 +04002010-10-11T22:11:28+04:00312010bEurope/MoscowMon, 11 Oct 2010 22:11:28 +0400 2010, 22:11:28
25

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

ответил fschmitt 11 +04002010-10-11T17:54:57+04:00312010bEurope/MoscowMon, 11 Oct 2010 17:54:57 +0400 2010, 17:54:57
13
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e' 
Sun Sep 16 20:33:20 2007

Это может пригодиться для тех приложений, которые используют время epoch в файлах журнала:

$ 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)
ответил Stefan Lasiewski 11 +04002010-10-11T22:04:25+04:00312010bEurope/MoscowMon, 11 Oct 2010 22:04:25 +0400 2010, 22:04:25
10

С 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
ответил Stéphane Chazelas 31 J000000Friday15 2015, 23:24:06
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
ответил al. 9 22010vEurope/Moscow11bEurope/MoscowTue, 09 Nov 2010 14:57:27 +0300 2010, 14:57:27
6

Пользовательский формат с GNU date:

date -d @1234567890 +'%Y-%m-%d %H:%M:%S'

Или с помощью GNU awk:

awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'

Связанный вопрос SO: https://stackoverflow.com/questions/3249827/convert -из-UnixTime-на-командной строке

ответил Ivan Chau 23 AM00000070000004431 2013, 07:02:44
5

С помощью zsh вы можете использовать strftime builtin:

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

ответил don_crissti 31 J000000Friday15 2015, 22:56:48
3

Если время вашей эпохи находится в миллисекундах вместо секунд, удалите последние три цифры, прежде чем передавать его в 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 10 FebruaryEurope/MoscowbWed, 10 Feb 2016 11:19:58 +0300000000amWed, 10 Feb 2016 11:19:58 +030016 2016, 11:19:58
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
ответил Meow 15 TueEurope/Moscow2015-12-15T19:52:59+03:00Europe/Moscow12bEurope/MoscowTue, 15 Dec 2015 19:52:59 +0300 2015, 19:52:59
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 22 TueEurope/Moscow2015-12-22T10:43:42+03:00Europe/Moscow12bEurope/MoscowTue, 22 Dec 2015 10:43:42 +0300 2015, 10:43:42
-1

PowerShell - конвертирует Unix или Epoch в формат для чтения

http: //winplat.net/2015/12/14/powershell-convert-unix-or-epoch-time-to-readable-format/

ответил sunny 14 MonEurope/Moscow2015-12-14T19:21:13+03:00Europe/Moscow12bEurope/MoscowMon, 14 Dec 2015 19:21:13 +0300 2015, 19:21:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132