Преобразовать метку времени Unix в строку даты
Существует ли быстрый однострочный способ преобразования метки времени Unix в дату из командной строки Unix?
date
может работать, за исключением того, что довольно неудобно указывать каждый элемент (месяц, день, год, час и т.д.), и я не могу понять, как заставить его работать должным образом. Кажется, что может быть проще - я что-то упустил?
Ответы
Ответ 1
С date
GNU вы можете сделать:
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
Ответ 2
date -d @1278999698 +'%Y-%m-%d %H:%M:%S'
Где число за @
- это число в секундах
Ответ 3
Это решение работает с версиями даты, которые не поддерживают date -d @
. Он не требует AWK или других команд. Временная метка Unix - это количество секунд с 1 января 1970 года, UTC, поэтому важно указать 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 в дату
Ответ 4
Как отмечает @TomMcKenzie в комментарии к другому ответу, date -r 123456789
, возможно, является более распространенным (то есть более широко реализованным) простым решением в течение нескольких секунд с момента Unix Epoch, но, к сожалению, нет универсального гарантированного портативного решения.
Опция -d
для многих типов систем означает нечто совершенно иное, чем расширение GNU Date --date
. К сожалению, GNU Date не интерпретирует -r
так же, как и эти другие реализации. К сожалению, вы должны знать, какую версию date
вы используете, а многие старые Unix-команды date
не поддерживают ни одну из опций.
Хуже того, POSIX date
не распознает ни -d
, ни -r
и не предоставляет стандартного способа в любой команде вообще (что я знаю) для форматирования времени Unix из командной строки (поскольку POSIX Awk также не хватает strftime()
). (Вы не можете использовать touch -t
и ls
, потому что первое не принимает время, указанное в секундах с момента Unix.)
Обратите внимание, что хотя One True Awk, доступный прямо от Брайана Кернигана, теперь имеет встроенную функцию strftime()
, а также функцию systime()
, чтобы вернуть текущее время в секундах с момента Unix Epoch), так что, возможно, Awk решение является самым портативным.
Ответ 5
Если вы обнаружите, что обозначение неудобно, возможно, помощь -R
-option. Он выдает дату в формате RFC 2822. Таким образом, вам не понадобятся все эти идентификаторы: date -d @1278999698 -R
. Другая возможность - вывести дату в секундах в вашем регионе: date -d @1278999698 +%c
. Должно быть легко запомнить.: -)
Ответ 6
Стандартное решение Perl:
echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'
(или местное время, если это необходимо)
Ответ 7
Небольшая коррекция для ответа 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 год.
Ответ 8
Другие примеры здесь трудно запомнить. В простейшем случае:
date -r 1305712800
Ответ 9
awk 'BEGIN { print strftime("%c", 1271603087); }'
Ответ 10
Поместите следующее в ваш ~/.bashrc:
function unixts() { date -d "@$1"; }
Пример использования:
$ unixts 1551276383
Wed Feb 27 14:06:23 GMT 2019
Ответ 11
Я много работаю с фиксированными периодами времени, поэтому сделал свой собственный инструмент на https://unixtime.ninja