В чем разница между форматами даты ISO 8601 и RFC 3339?
ISO 8601 и RFC 3339, по- видимому, являются двумя общими форматами в Интернете. Должен ли я использовать один над другим? Это просто расширение? Мне действительно нужно заботиться так плохо?
6 ответов
Это просто расширение?
В значительной степени, да - RFC 3339 указан в качестве профиля ISO 8601. В частности, RFC 3339 требует полного представления даты и времени (только дробные секунды необязательны). RFC также имеет некоторые небольшие, тонкие различия. Например, усеченные представления лет только с двумя цифрами недопустимы - RFC 3339 требует 4-значных лет, а RFC позволяет использовать символ точки только в качестве десятичной точки в течение доли секунды. RFC также позволяет заменять букву "Т" пробелом (или другим символом), в то время как стандарт допускает его исключение (и только в том случае, если существует согласие между всеми сторонами, использующими представление).
Я не стал бы слишком сильно беспокоиться о различиях между ними, но в случае непредвиденной вероятности, что ваш вариант использования натолкнется на них, стоит взглянуть на:
Между ISO 8601 и RFC 3339 существует множество различий. Вот несколько примеров, которые помогут вам понять:
2020-12-09T16:09:53+00:00
- значение даты и времени, соответствующее обоим стандартам.
2020-12-09 16:09:53+00:00
использует пробел для разделения даты и времени. Это разрешено RFC 3339, но не разрешено ISO 8601.
2020-12-09T16:09:53-00:00
имеет отрицательный знак во временном сдвиге. Это разрешено RFC 3339, но не разрешено ISO 8601.
20201209T160953Z
опускает дефисы. Это разрешено ISO 8601, но не разрешено RFC 3339.
ISO 8601 допускает такие вещи, как порядковые даты, такие как
2020-344
что соответствует 344-му дню 2020 года. RFC 3339 не допускает этого.
По вашим вопросам:
Это просто расширение?
Нет. Как показано выше, каждый стандарт поддерживает варианты синтаксиса, не поддерживаемые другим стандартом. Таким образом, один синтаксис не является расширением или расширением другого.
Должен ли я использовать одно вместо другого?
Конечно, это зависит от вашего сценария. Общая безопасная стратегия - генерировать строки даты и времени, соответствующие обоим стандартам.
Еще одна хорошая общая стратегия - использовать существующую стандартную библиотеку для синтаксического анализа / форматирования строк даты и времени и не писать собственные реализации, если вы не обращаетесь к действительно настраиваемому сценарию.
Неужели мне действительно нужно так сильно волноваться?
Что ж, решать тебе. Большинство обычных разработчиков, которые имеют дело со строками даты и времени, должны иметь высокий уровень понимания, но не должны углубляться в детали.
RFC 3339 - это, в основном, профиль ISO 8601, но на самом деле он несовместим с заимствованием спецификации часового пояса "-00:00" из RFC 2822. Это описано в статье Википедии.
На самом деле получить доступ к спецификации ISO кажется трудным и / или дорогим. Вот почему вместо этого мы видим много ссылок на страницу википедии.
Только по этой причине я предпочитаю RFC3339: вы можете сразу перейти к первоисточнику.
Вы не должны заботиться так сильно. RFC 3339, как он сам по себе, представляет собой набор стандартов, основанных на ISO 8601. Хотя есть немало минутных различий, и все они изложены в RFC 3339. Я мог бы просмотреть их все здесь, но вы, вероятно, справитесь лучше просто прочитайте документ для себя, если вы беспокоитесь:
'2018-03T13:24:59,321T' <- Действительный ISO 8601
'2018-03T13:24:59,321T' <- Неверный ISO 3339
Есть хотя бы одно отличие