В чем разница между форматами даты ISO 8601 и RFC 3339?

281

ISO 8601 и RFC 3339, по- видимому, являются двумя общими форматами в Интернете. Должен ли я использовать один над другим? Это просто расширение? Мне действительно нужно заботиться так плохо?

Марк Эмери
источник
42
Я изменил ссылку на RFC с ietf.org/rfc/rfc3339.txt на HTML-версию по адресу tools.ietf.org/html/rfc3339 . При ссылках на RFC вы всегда должны ссылаться на HTML-версии по адресу tools.ietf.org/html . Мало того, что с ними легче ориентироваться благодаря ссылкам на разделы, но, что важно, они перечисляют вверху любые RFC, которые обновили или устарели RFC, который вы читаете. Люди невольно цитируют устаревшие RFC на Stack Overflow, и я буду повторять этот совет до тех пор, пока эта проблема не исчезнет. (Во избежание сомнений этот RFC не устарел.)
Марк Амери

Ответы:

239

Это просто расширение?

В значительной степени, да - RFC 3339 указан в качестве профиля ISO 8601. В частности, RFC 3339 определяет полное представление даты и времени (только дробные секунды необязательны). RFC также имеет некоторые небольшие, тонкие различия. Например, усеченные представления лет только с двумя цифрами недопустимы - RFC 3339 требует 4-значных лет, а RFC разрешает использовать символ точки только в качестве десятичной точки в течение доли секунды. RFC также позволяет заменять букву «Т» пробелом (или другим символом), в то время как стандарт допускает его только опускание (и только при наличии согласия между всеми сторонами, использующими представление).

Я не стал бы слишком сильно беспокоиться о различиях между ними, но в случае непредвиденного случая, когда ваш вариант использования столкнется с ними, стоит взглянуть на:

ConroyP
источник
11
И наоборот, ISO позволяет опускать 'T', но RFC 3339 обязывает его tools.ietf.org/html/rfc3339#page-12
Java Guy
21
Извините, Ява, парень, но это не совсем правильно. Приложение, на которое вы ссылаетесь, носит исключительно информационный характер, а ограничение - для упрощения грамматики. В примечании в конце раздела 5.6 четко говорится, что для удобства чтения можно использовать пробел, ссылаясь на более раннее упоминание о читаемости, которое является предметом раздела 5.2. процитирую: «Приложения, использующие этот синтаксис, могут выбрать для удобства чтения указание полной даты и полной занятости, разделенных, скажем, пробелом».
Грег А. Вудс
8
@JavaGuy Приложение, с которым вы связаны, даже не говорит о синтаксисе RFC 3339 - оно называется ISO 8601 Collected ABNF и является попыткой формально описать грамматику ISO 8601 с использованием ABNF . Ничто из того, что говорится, не должно восприниматься как доказательство синтаксиса даты и времени RFC 3339.
Марк Амери
3
FWIW: это обсуждалось в списке coreutils: lists.gnu.org/archive/html/bug-coreutils/2006-05/msg00019.html
Фредерик Норд,
9
Я - автор, с которым связался Джастин (предыдущий комментарий) (хотя он не несет ответственности за большую часть тяжелой работы там). Я подтверждаю его комментарий. Как правило, я бы предложил, чтобы спецификации, такие как RFC3339, указывали, а не требовали - это контекст использования, который определяет, что требуется . Пока понятно, что подразумевается, ссылка на конкретный синтаксис является хорошей. (Это на самом деле не отличается от того, что сам RFC3339 делает при выборочной ссылке на ISO8601.) См. Также ПРИМЕЧАНИЕ в разделе 5.6 .
Грэм Клин
20

RFC 3339 - это, в основном, профиль ISO 8601, но на самом деле он несовместим с заимствованием спецификации часового пояса "-00: 00" из RFC 2822. Это описано в статье Википедии.

Zefram
источник
4

Вы не должны заботиться так сильно. RFC 3339, как он сам по себе, представляет собой набор стандартов, основанных на ISO 8601. Хотя есть немало минутных различий, и все они изложены в RFC 3339. Я мог бы просмотреть их все здесь, но вы, вероятно, справитесь лучше просто прочитайте документ для себя, если вы беспокоитесь:

http://tools.ietf.org/html/rfc3339

Дэвид Мортон
источник