Преобразовать метку времени Unix в строку даты - PullRequest
109 голосов
/ 14 июля 2010

Существует ли быстрый однострочный способ преобразования метки времени Unix в дату из командной строки Unix?

date может работать, за исключением того, что указывать каждый элемент (месяц, день довольно неудобно), год, час и т. д.), и я не могу понять, как заставить его работать должным образом.Кажется, что может быть проще - я что-то упустил?

Ответы [ 10 ]

148 голосов
/ 14 июля 2010

С GNU date вы можете сделать:

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(From: BASH: конвертировать метку времени Unix в дату )

в ОСX, используйте date -r.

date -r "$TIMESTAMP"

В качестве альтернативы используйте strftime().Он недоступен напрямую из оболочки, но вы можете получить к нему доступ через gawk .Спецификатор %c отображает метку времени в зависимости от локали.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST
58 голосов
/ 15 июля 2010

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' Где число за @ - это число в секундах

21 голосов
/ 01 января 2013

Это решение работает с версиями даты, которые не поддерживают date -d @.Он не требует AWK или других команд.Временная метка Unix - это количество секунд с 1 января 1970 года по Гринвичу, поэтому важно указать UTC.

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

Если вы работаете на Mac, используйте:

date -r 1357004952

Команда для получения эпохи:

date +%s
1357004952

Кредит переходит к Антону: BASH: конвертировать метку времени Unix в дату

9 голосов
/ 01 января 2013

Как говорит @TomMcKenzie в комментарии к другому ответу, date -r 123456789, возможно, является более распространенным (то есть более широко реализованным) простым решением для времени, которое дается в секундах с начала эпохи Unix, но, к сожалению, универсального гарантированного портативного решения не существует. 1002 *

Опция -d во многих типах систем означает нечто совершенно иное, чем расширение --date в GNU Date. К сожалению, GNU Date не интерпретирует -r так же, как эти другие реализации. К сожалению, вам нужно знать, какую версию date вы используете, и многие старые команды Unix date не поддерживают ни одну из этих опций.

Еще хуже, POSIX date не распознает ни -d, ни -r и не предоставляет никакого стандартного способа в какой-либо команде (насколько я знаю) для форматирования времени Unix из командной строки (поскольку в POSIX Awk также отсутствует strftime()). (Вы не можете использовать touch -t и ls, поскольку первый не принимает время, указанное в секундах с начала эпохи Unix.)

Обратите внимание, что One One Awk, доступный напрямую от Брайана Кернигана, теперь имеет встроенную функцию strftime(), а также функцию systime() для возврата текущего времени в секундах с начала эпохи Unix), так что, возможно, Awk Решение является наиболее портативным.

4 голосов
/ 15 июля 2010

Если вы находите нотацию неловкой, возможно, вариант -R поможет. Это превосходит дату в формате RFC 2822. Таким образом, вам не понадобятся все эти идентификаторы: date -d @1278999698 -R. Другая возможность - вывести дату в секундах в вашей локали: date -d @1278999698 +%c. Должно быть легко запомнить. : -)

2 голосов
/ 01 июля 2015

Другие примеры здесь трудно запомнить.Самое простое:

date -r 1305712800
2 голосов
/ 18 ноября 2014

Небольшая поправка к ответу dabest1 выше.Укажите часовой пояс как UTC, а не по Гринвичу:

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

Второй правильный.Я думаю, что причина в том, что в Великобритании летнее время постоянно действовало с 1968 по 1971 год.

2 голосов
/ 06 ноября 2012

Стандартное решение Perl:

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(или по местному времени, если предпочтительнее)

1 голос
/ 14 июля 2010
awk 'BEGIN { print strftime("%c", 1271603087); }'
0 голосов
/ 27 февраля 2019

Добавьте в ~ / .bashrc следующее:

function unixts() { date -d "@$1"; }

Пример использования:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
...