日期/时间类型输入都使用下面的过程解码。
将输入字符串打断成记号并且把每一个记号分类为一个字符串、时间、时区或数字。
如果数字记号包含一个分号(:
),那么这是一个时间字符串。包括所有后续数位和分号。
如果数字记号包含一个连字符(-
)、斜线(/
)或两个以上的句点(.
),那么这是一个日期字符串,它可能含有一个文本形式的月份。如果一个日期记号已经被看到,它会转而被解释为一个时区名(例如America/New_York
)。
如果记号只是数字,那么它要么是一个单一域,要么是一个 ISO 8601 串连日期(例如 1999年1月13日是19990113
)或时间(例如 14:15:16 是141516
)。
如果记号以一个加号(+
)或减号(-
)开始,那么它要么是一个数字的时区,要么是一个特殊域。
如果记号是一个文本字符串,使之匹配可能的串:
对作为一个时区缩写的记号做一次二分法表查找。
如果没有找到,做一次类似的二分法表查找来将该记号匹配为一个特殊串(例如today
)、日(例如Thursday
)、月(例如January
)或噪音词(例如at
、on
)。
如果仍然没有找到,则抛出一个错误。
当记号是一个数字或数字域时:
如果有 8 位或 6 位,并且之前没有读到其他日期域,那么解释为一个“串连日期”(例如19990118
或990118
)。翻译是YYYYMMDD
或YYMMDD
。
如果记号是 3 位并且已经读到了一个年域,那么解释为一年中的第几日。
如果是 4 位或 6 位并且已经读到了一个年域,那么解释为一个时间域(HHMM
或HHMMSS
)。
如果是 3 位或更多位并且还没有读到日期域,解释为一个年域(这会强制剩余日期域的 yy-mm-dd 顺序)。
否则日期域顺序被假定为遵循DateStyle
设置:mm-dd-yy、dd-mm-yy 或 yy-mm-dd。如果一个月或日域被发现超过范围,则抛出一个错误。
如果已经指定了 BC ,对年求反并且加一用于内部存储(在格里高利历中没有 0 年,因此数字的 1 BC 就是 0 年)。
如果没有指定 BC ,并且如果该年域长度为两位,那么把该年域调整为四位。如果该域小于 70,则增加 2000,否则增加 1900。
格里高利年 AD 1-99 可以使用带有前导零的 4 位形式录入(例如0099
是 AD 99)。