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

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

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

9 ответов


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

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

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

в OS X Используйте date -r.

date -r "$TIMESTAMP"

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

echo "$TIMESTAMP" | gawk '{print strftime("%c", )}'
# echo 0 | gawk '{print strftime("%c", )}'
Wed 31 Dec 1969 07:00:00 PM EST

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


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


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

на -d опция на многих типах систем означает что-то совершенно отличное от GNU Date


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


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

date -r 1305712800

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

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

(или localtime, если предпочтено)


awk 'BEGIN { print strftime("%c", 1271603087); }'

небольшая поправка к ответу 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 год.