使用以下过程解码日期/时间输入字符串。
将输入字符串分解为标记,并将每个标记归类为字符串、时间、时区或数字。
如果数字标记包含冒号 (:
),则这是一个时间字符串。包括所有后续数字和冒号。
如果数字标记包含破折号 (-
)、斜杠 (/
) 或两个或更多点 (.
),则这是一个可能包含文本月份的日期字符串。如果已经看到日期标记,则将其解释为时区名称(例如,America/New_York
)。
如果标记仅为数字,则它是一个单字段或 ISO 8601 连接的日期(例如,19990113
表示 1999 年 1 月 13 日)或时间(例如,141516
表示 14:15:16)。
如果标记以加号 (+
) 或减号 (-
) 开头,则它是一个数字时区或一个特殊字段。
如果标记是字母数字字符串,则与可能的字符串匹配
查看标记是否与任何已知时区缩写匹配。这些缩写由 第 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。如果发现月份或日期字段超出范围,则抛出错误。
如果指定了公元前,则对年份取反并加一以进行内部存储。(格里高利历中没有公元 0 年,因此数字 1 公元前变为公元 0 年。)
如果未指定公元前,并且年份字段长度为两位,则将年份调整为四位。如果字段小于 70,则添加 2000,否则添加 1900。
格里高利历 1-99 年可以使用 4 位数字和前导零输入(例如,0099
是 99 年)。