日期/时间输入字符串按以下过程解码。
把输入字符串拆分成记号,并把每个记号归类为字符串、时间、时区或 数字。
如果数字记号包含冒号(:),这是一个
时间字符串。包含后续的所有数字和冒号。
如果数字记号包含短横线(-)、斜杠
(/)或两个或更多点(.),这是一个
可能带有文本月份的日期字符串。如果日期记号
已经出现过,它会被解释为时区名
(例如 America/New_York)。
如果记号只包含数字,那么它要么是单个字段,要么是 ISO 8601
拼接的日期(例如,1999 年 1 月 13 日为
19990113)或时间
(例如,14:15:16 为 141516)。
如果记号以加号(+)或减号
(-)开头,那么它要么是数字时区,要么是特殊
字段。
如果记号是字母字符串,与可能的字符串匹配:
检查记号是否匹配任何已知的时区缩写。 这些缩写由 Section B.4 中描述的 配置设置决定。
如果没有找到,搜索内部表,把记号匹配为特殊字符串
(例如 today)、星期(例如
Thursday)、月份(例如
January)或噪声词(例如
at、on)。
如果仍未找到,抛出错误。
当记号是数字或数字字段时:
如果它有八个或六个数字,并且之前没有读过其他日期字段,则解释为
“拼接日期”(例如
19990118 或 990118)。
解释方式是 YYYYMMDD 或
YYMMDD。
如果记号是三个数字且已经读过年份,则解释为一年中的第几 天。
如果是四个或六个数字且已经读过年份,则解释为时间
(HHMM 或 HHMMSS)。
如果是三个或更多数字且尚未找到任何日期字段,则解释为年份 (这强制剩余日期字段采用 yy-mm-dd 顺序)。
否则,假定日期字段顺序遵循
DateStyle 设置:mm-dd-yy、dd-mm-yy 或
yy-mm-dd。如果发现月份或日期字段超出范围,则抛出错误。
如果指定了 BC(公元前),则把年份取负并加一后进行内部存储。 (公历没有公元零年,因此在数值上公元前 1 年成为零年。)
如果未指定 BC,并且年份字段是两位数字,则把年份调整为四位数字。 如果该字段小于 70,则加上 2000,否则加上 1900。
公元 1–99 年可以通过使用带前导零的 4 位数字来输入
(例如 0099 是公元 99 年)。