B.1. Интерпретация данных даты и времени #
Строки с датой/временем разбираются при вводе по следующему алгоритму.
Разделить входную строку на фрагменты и определить каждый фрагмент как строку, время, часовой пояс или цифру.
Если числовой фрагмент содержит двоеточие (
:
), значит эта строка представляет время. Включаются все последующие цифры и двоеточия.Если числовой фрагмент содержит тире (
-
), косую черту (/
) или две и более точек (.
), то это строка даты, которая, возможно, включает название месяца. Если фрагмент даты уже встречался, он интерпретируется как название часового пояса (например,America/New_York
).Если этот фрагмент является лишь числом, он представляет собой отдельное поле или составную дату ISO 8601 (например,
19990113
для 13 января 1999 года) или время (например,141516
для 14:15:16).Если фрагмент начинается с плюса (
+
) или минуса (-
), то это или числовой часовой пояс или специальное поле.
Если фрагмент содержит только буквы, сопоставить его с возможными строками:
Проверить, не совпадает ли фрагмент с известной аббревиатурой часового пояса. Эти аббревиатуры считываются из файла конфигурации, описанного в Разделе B.4.
Если фрагмент не найден, проверить во внутренней таблице, не совпадает ли он со специальной строкой (например,
today
), днём недели (например,Thursday
), месяцем (например,January
) или игнорируемым словом (например,at
,on
).Если фрагмент всё же не найден, выдать ошибку.
Когда фрагмент является числом или числовым полем:
Если получено восемь или шесть цифр и никакое другое поле даты ранее не было прочитано, интерпретировать их как «составленную дату» (например,
19990118
или990118
). Такая дата интерпретируется какГГГГММДД
илиГГММДД
.Если фрагмент представляет собой трёхзначное число, и год уже был прочитан, интерпретировать как день года.
Если это четыре или шесть цифр и год уже был прочитан, интерпретировать как время (
ЧЧММ
илиЧЧММСС
).Если найдены три или более цифр, а поля даты ещё не были найдены, интерпретировать как год (это ведёт к установке порядка гг-мм-дд для оставшихся полей даты).
В противном случае подразумевается, что порядок сортировки полей даты определяется значением
DateStyle
: мм-дд-гг, дд-мм-гг или гг-мм-дд. Выдать ошибку, если оказалось, что поле месяца или дня вышло за пределы диапазона.
Если указан год до н. э., отнять год и добавить единицу для внутреннего хранения. (В григорианском календаре отсутствует нулевой год, поэтому 1 год до н. э. становится нулевым.)
Если год до н. э. не был указан, и если поле года имело два разряда, установить для записи года четыре разряда. Если поле меньше 70, добавить 2000, в противном случае добавить 1900.
Подсказка
Годы 1–99 н. э. по григорианскому календарю могут вводиться в виде четырёхзначного числа с начальными нулями (например,
0099
— 99 год н. э.).