2010-07-14 7 views
79

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

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

+2

Какой тип оболочки вы используете? Bash? Zsh? Даш? –

+0

Баш - забыл упомянуть! – chimeracoder

+1

Возможный дубликат [Как преобразовать временные метки в даты в bash?] (Http://stackoverflow.com/questions/2371248/how-to-convert-timestamps-to-dates-in-bash) – user

ответ

106

С ГНУ date вы можете сделать:

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

(От: BASH: Convert Unix Timestamp to a Date)

На 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 
49

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

+26

В OSX 10.8 это 'date -r 1278999698 + '% Y-% m-% d% H:% M:% S'' (GMT) или просто' date -r 1278999698' –

4

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

2

Стандартное решение Perl является:

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

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

18

Это решение работает с версиями даты, которые не поддерживают 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: Convert Unix Timestamp to a Date

9

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

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

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

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

1

Незначительная коррекция ответа вышеперечисленного. Укажите часовой пояс как 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 год.

+0

Спасибо, я обновил свой ответ. – dabest1

2

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

date -r 1305712800 
Смежные вопросы