Что такое стандартная команда для печати даты в формате RFC-3339?


19

Команда dateне предлагает ничего подобного, что довольно печально, поскольку RFC-3339 - это современный, широко распространенный, здравый формат, используемый везде (кроме электронной почты, которая не является ни современной, ни здравой).

Мое смещение часового пояса в настоящее время составляет -08: 00, поэтому самая простая форма этой команды должна выводить текущее время как 2013-09-05T14:58:33.102-08:00.


Какой стандарт (ы) вас интересует?
Стефан Шазелас

Лично я в порядке с GNU, но по большому счету все должно быть шире. Он также должен иметь разумное значение по умолчанию (короткая опция, точность в миллисекундах) и иметь способ указать точность в секунду (количество цифр, отличное от 0 или 9).
Мартин Джамбон

1
Это не нормальный формат: полное отсутствие пробелов затрудняет чтение людьми. Вы должны использовать небольшое отклонение, 2013-09-05 14:58:33.102 -0800кроме случаев, когда есть какая-то причина, почему пробелы вообще не должны использоваться.
Звол

1
Я сравнивал его с почтовым форматом даты (RFC 822, 2822), который трудно читать людям и машинам.
Мартин Джамбон

Ответы:


30

Похоже , что вы можете сделать несколько форматов , используя переключатель для реализации ГНУ date(версии 5.90 или выше), --rfc3339=.

Примеры

$ date --rfc-3339=date
2014-03-19

$ date --rfc-3339=seconds
2014-03-19 18:00:05-04:00

$ date --rfc-3339=ns
2014-03-19 18:00:08.179780629-04:00

Если вы хотите, Tчтобы был добавлен, как взломать:

$ date --rfc-3339=seconds | sed 's/ /T/'
2014-03-19T18:35:03-04:00

Если вы хотите это в миллисекундах:

$ date --rfc-3339=ns | sed 's/ /T/; s/\(\....\).*\([+-]\)/\1\2/g'
2014-03-19T18:42:52.362-04:00

Ссылки


7
В наши дни не требуется взлом, чтобы получить «Т». --iso-8601' option accepts the same arguments as --Rfc-3339`, и включает в себя «T» в его выходе.
Ти Стрга

1
Сед часть s/\(\....\).*-/\1-/gдолжна s/\(\....\).*\([+-]\)/\1\2/gтакже работать восточнее Атлантики.
Сванте

1
@svante - спасибо за детали, исправлено.
SLM

2
@Eonil, что на самом деле не правильно, RFC3339 утверждает: в NOTE: ISO 8601 defines date and time separated by "T".то время как RFC3339 позволяет вместо этого использовать пробел. Читайте ietf.org/rfc/rfc3339.txt Раздел 5.6
rwenz3l

1
@ rwenz3l Моя вина. Я только прочитал только часть ABNF и пропустил примечания. Спасибо за указание на это!
Эонил

18

С GNU date(5,90 или выше):

$ TZ=America/Anchorage date '+%FT%T.%N%:z'
2014-03-19T14:29:31.041119357-08:00

Заменить %Nс %3Nдля миллисекунд, в %6Nтечение микросекунд ...

AFAIK, ни одна из спецификаций POSIX, Unix или LSB не определяет какую-либо команду, которая может отображать время с точностью до доли секунды, но дробная часть является необязательной в RFC 3339.

POSIX / Unix / LSB strftime поддерживает %zотображение смещения TZ как -0800, поэтому наиболее переносимым, что вы, вероятно, собираетесь получить, является:

 $ TZ=America/Anchorage perl -MPOSIX -le '$t = strftime "%Y-%m-%dT%T%z",
   localtime; $t =~ s/..$/:$&/; print $t'
 2014-03-19T14:30:23-08:00

8

GNU dateимеет встроенный формат ISO-8601 - не слишком ли он близок или вообще не соответствует RFC-3339?

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600

ISO-8601 допускает различное форматирование даты и времени, но я думаю, что OP специально запрашивает формат даты W3C «Полная дата плюс часы, минуты, секунды и десятичная дробь секунды ГГГГ-ММ-ДДЧч: мм: сс.сTZD (например, 1997-07-16T19: 20: 30.45 + 01: 00) " - W3C Форматы даты и времени .
Хакре

8

Как насчет старого доброго:

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200

Где информация о часовом поясе?
Рафаэль Аренс

Это работает как на Mac, так и на Linux 'date'
Эран Четцрони

1
Как насчет миллисекунд?
Мартин Джембон

6
быстрое примечание, здесь, без открытия RFC, сегмент часового пояса, 0200пропускает двоеточие, которое может сломать некоторые системы, которые в этом нуждаются.
Майк Макинтош

2
Примечание @ MikeMackintosh уместно; вывод, показанный здесь, не является официальной датой RFC 3339. Двоеточие в сегменте часового пояса требуется для RFC 3339; см. определение time-numoffsetна tools.ietf.org/html/rfc3339#section-5.6 .
Марк Амери

7

Вы также можете проще отформатировать время в соответствии с RFC3339 (ISO8601) :

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2016-11-08T08:52:55Z

ПРИМЕЧАНИЕ. Этот формат также используется в конвенции Label Schema Convention RC 1.0.


Это не действительный RFC3339. Ответ Эрана на `` `date +% Y-% m-% dT% T% z` `` является правильным и содержит меньше символов. Если вы хотите в UTC передать флаг -u, который обнулит смещение часового пояса.
briceburg

С -uфлагом этот ответ правильный, верно?
Ласси

0
echo "Local date only:"
date '+%Y-%m-%d'
echo
echo "Local date and time:"
date '+%Y-%m-%dT%H:%M:%S%z' | sed 's@^.\{22\}@&:@'
echo
echo "UTC date and time:"
date -u '+%Y-%m-%dT%H:%M:%SZ'

Эти команды совместимы с POSIX, за исключением %zспецификации преобразования. Тем не менее, %zон широко поддерживается и работает одинаково в Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix и Haiku. Он также работает с инструментами Busybox, Toybox и sbase (утилиты базовой системы suckless.org). Поскольку %zвыводит смещение часового пояса в ±HHMMформате, нам нужен sedканал, чтобы добавить двоеточие и изменить его на ±HH:MM.

ПРИМЕЧАНИЕ. Команда проекта Heirloom dateимеет несовместимый %zвывод: она не печатает +знак.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.