Преобразование метки времени Unix в строку даты

128

Есть ли быстрый однострочный способ преобразовать временную метку Unix в дату из командной строки Unix?

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

chimeracoder
источник
1
возможный дубликат Как преобразовать метки времени в даты в bash?
пользователь

Ответы:

181

С GNU dateвы можете:

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

(От: BASH: преобразовать отметку времени Unix в дату )

В OS 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
Джон Кугельман
источник
3
Обязательно удалите миллисекунды из отметки времени (это всего 10 цифр вместо 13), иначе вы получите недопустимые результаты (это верно для даты macOS).
Emerino
Я думал, что это не работает, пока не понял, что у меня есть отметка времени в миллисекундах. Отрежьте последние 3 цифры, и вы получите точное время
Стюарт
64

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

QBi
источник
28
В OSX 10.8 это date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) или простоdate -r 1278999698
Том Маккензи,
Работает для Ubuntu 16.04
Майк Q
24

Это решение работает с версиями date, которые не поддерживают 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 в дату

dabest1
источник
10

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

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

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

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

Грег А. Вудс
источник
4

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

QBi
источник
2

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

$ 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

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

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

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

Уильям Перселл
источник
1
awk 'BEGIN { print strftime("%c", 1271603087); }'
Сьерд
источник
1

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

date -r 1305712800
denmojo
источник
Смешанные результаты: не работает в Ubuntu Linux, но работает, например, в Mac OS X.
Майк Кью
1

Поместите в свой ~ / .bashrc следующее:

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

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

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019
Dangelov
источник
-1

Python:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
Итачи
источник