Русский

Инструменты разработчика · Конвертеры синтаксиса

Почему TOML имеет собственный тип даты и времени, а JSON — нет (RFC 3339)

· Фон

Томл JSON временные метки

Четыре временных значения TOML, суженные до строк в кавычках JSON без изобретения зоны
Оригинальная векторная иллюстрация ToolAcre

TOML — единственный формат в этой группе с первоклассными датами и временем, определяемыми RFC 3339. В этом посте объясняются четыре типа даты и времени TOML, почему JSON намеренно не имеет ни одного и какое отношение к ним имеет преобразование.

Дата, которая стала строкой — конфигурация TOML с датой выпуска, преобразованная в JSON и сведенная к тексту.

Локальная дата TOML, например `1979-05-27`, становится строкой JSON `"1979-05-27"`. Символы календаря сохраняются, а собственный тип TOML — нет. При обратном преобразовании JSON записывается строка в кавычках, а не токен даты, а ToolAcre выдает предупреждение при первом преобразовании.

Это неизбежная граница в выбранном простом значении JSON. Вызов туда и обратно без потерь приведет к путанице сохраненного текста с сохраненным типом. В предупреждении указывается как путь, так и временной тип, чтобы проверяющие могли решить, приемлема ли строка в дальнейшем.

Почему JSON не имеет типа даты — минимализм Крокфорда, строковое соглашение ISO 8601 и соглашение о миллисекундах с эпохи, которые конкурируют за заполнение пробела

При синтаксическом анализе JSON здесь выдаются значения NULL, логические значения, числа, строки, массивы и объекты; он не создает объекты Date. Репозиторий подтверждает факт реализации, но не содержит исторических объяснений минимализма JSON или конкурирующих отраслевых соглашений.

Приложения могут использовать строки или номера эпох, подобные ISO, по соглашению, но это соглашения, наложенные на JSON. Преобразователи синтаксиса не выводят его из произвольного текста и не преобразуют временные значения TOML в арифметику эпохи.

JSON не имеет собственного типа даты в этом конвертере; обоснование происхождения — свидетельства вне хранилища

TOML предоставляет четыре типа: смещение даты и времени с Z или числовым смещением, локальная дата-время без зоны, локальная дата и местное время. smol-toml представляет их как объекты типа даты, несущие метаданные типа; ToolAcre идентифицирует каждый из них перед его нормализацией.

Это различие предотвращает серьезную ошибку. Местное время не назначается автоматически UTC, а местная дата и время не перемещаются между зонами. Его отсутствующее смещение остается отсутствующим в строке JSON.

RFC 3339 в качестве основы — профиль ISO 8601, который заимствует TOML, включая допуск на разделитель пробелов

Нормализатор вызывает форматтер ISO значения синтаксического анализатора и удаляет только синтетическую фракцию `.000`. Он сохраняет значимые доли секунды и ориентированную на источник локальную форму по сравнению со смещением. В коде это описано как текст RFC 3339, но в статье не придумываются такие условия спецификации, как допуски на разделители помимо проверяемого вывода.

Пример смещения остается текстом даты и времени, а не преобразуется этим слоем в универсальное значение Z. Это позволяет избежать изменения письменного представления и сохраняет временную интерпретацию для приложения, которому оно принадлежит.

ToolAcre сохраняет временной текст, ориентированный на источник, не утверждая полные сведения о соответствии RFC 3339

Каждое временное значение становится строкой, и предупреждения сообщают, что JSON, YAML и XML не имеют типа даты в этой модели преобразования. Смещения не удаляются намеренно, и локальные значения не приобретают их. Потерянная информация — это сама категория типа TOML.

При обратном преобразовании строка заключается в кавычки, поскольку у записывающего устройства нет маркера, указывающего на необходимость восстановления даты и времени. Повторный анализ произвольных строк, похожих на дату, как дат приведет к неправильному типу обычных идентификаторов или меток и приведет к созданию соглашения, не разделяемого JSON.

Конвертер сохраняет локальное написание, а не смещенное, но затем теряет собственный тип TOML.

Используйте `odt = 1979-05-27T07:32:00Z`, `ldt = 1979-05-27T07:32:00`, `ld = 1979-05-27` и `lt = 07:32:00`. JSON содержит четыре строки с таким написанием. В предупреждении перечислены пути смещения даты и времени, локальной даты и времени, локальной даты и местного времени.

Преобразуйте JSON обратно в TOML. Каждое значение указано. Дробное значение `00.500Z` остается дробным, а значение целой секунды не получает `.000`. Это фактическое поддерживаемое поведение, которое четко демонстрирует сохранение текста по сравнению с потерянным типом.

Рабочий пример: все четыре временных типа TOML становятся строками и возвращаются в кавычках.

Поиск правил часового пояса, переход на летнее время и преобразование эпох не являются частью этого маршрута. Локальная дата-время без зоны не может стать одним уникальным моментом без дополнительной информации. Преобразователь временных меток Unix обращается к известным моментам времени по другому контракту.

Не передавайте каждую результирующую строку в JavaScript Date и принимайте эквивалентное значение. Местная дата, местное время и дата-время без зоны требуют контекста приложения. Сохраните предупреждение и семантику полей посредством миграции.

Вывод: TOML знает, что такое дата, JSON знает только, что такое строка, и как панель конвертеров синтаксиса показывает эту разницу в вашем браузере.

TOML знает четыре временные категории; JSON получает здесь только строки. ToolAcre тщательно сохраняет орфографию и отказывается изобретать зону, но собственный тип отсутствует и не может быть автоматически восстановлен при возврате.

Просмотрите каждый предупрежденный путь и определите соглашение приложения, при котором временная семантика должна сохраняться. Если такого соглашения не существует, сохраните TOML в качестве авторитетного источника, а не рассматривайте цитируемый маршрут туда и обратно как эквивалент.

Звуковое соглашение также определяет, какие строки могут быть проанализированы снова и в каком контексте. Смещение даты и времени может идентифицировать момент, в то время как локальная дата-время, дата или время не могут сделать это без дополнительных правил. Сохраните исходный вид рядом с нормализованной строкой, когда на более позднем этапе потребуется восстановить TOML или запланировать работу. В противном случае примите, что JSON содержит отображаемый текст, и избегайте молчаливого перевода его в универсальную временную метку.