Перетворити часову позначку Unix у рядок дати


128

Чи існує швидкий однолінійний спосіб перетворення часової позначки Unix в дату з командного рядка Unix?

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


Відповіді:


181

З GNU dateви можете:

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

(Від: 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

3
Не забудьте усунути мілісекунди від мітки часу (тобто лише 10 цифр замість 13), інакше ви отримаєте недійсні результати (це стосується дати macOS).
emerino

Я подумав, що це не працює, доки я не зрозумів, що маю часову позначку в мілі. Очистіть останні три цифри, і ви отримаєте точний час
Стюарт

64

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


28
На OSX 10.8 це date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) або простоdate -r 1278999698
Том Маккензі

Працює для Ubuntu 16.04
Майк Q

24

Це рішення працює з версіями дати, які не підтримують 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 на дату


10

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

-dВаріант на багатьох типах систем означає щось зовсім інше , ніж GNU Дейта --dateрозширення. На жаль, Дата GNU не інтерпретує -rте саме, що й інші реалізації. Тож, на жаль, ви повинні знати, яку версію dateви використовуєте, і багато старих dateкоманд Unix не підтримують жоден варіант.

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

Зауважте, що тепер у One True Awk, доступного безпосередньо від Брайана Керніган, є strftime()вбудована функція, а також systime()функція повернення поточного часу за секунди після Unix Epoch), тому, можливо, рішення Awk є найбільш портативним.


4

Якщо ви вважаєте, що позначення незручне, можливо, -Rваріант-це допомагає. Він випереджає дату у форматі RFC 2822. Таким чином , ви не потрібні всі ці ідентифікатори: date -d @1278999698 -R. Інша можливість полягає в тому, щоб вивести дату в секундах в вашому регіоні: date -d @1278999698 +%c. Слід легко запам'ятати. :-)


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 рік.




1

Інші приклади тут важко запам'ятати. Найпростіше:

date -r 1305712800

Змішані результати: не працює в ubuntu Linux, але працює в Mac OS X, наприклад.
Майк Q

1

Помістіть у своєму ~ / .bashrc:

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

Приклад використання:

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

-1

Пітон:

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.