## B.1.日期/时间输入解释 使用以下程序对日期/时间输入字符串进行解码。 1. 将输入字符串拆分为标记,并将每个标记分类为字符串、时间、时区或数字。 1. 如果数字标记包含冒号(`:`),这是一个时间字符串。包括所有后续数字和冒号。 2. 如果数字标记包含破折号(`-`),斜杠(`/`),或两个或更多点(`.`),这是一个日期字符串,可能有一个文本月。如果已经看到日期标记,则将其解释为时区名称(例如。,`美国/纽约`). 3. 如果标记仅为数字,则它是单个字段或ISO 8601连接日期(例如。,`19990113`1999年1月13日)或时间(例如。,`141516`14:15:16)。 4. 如果代币以加号开头(`+`)或负(`-`),则它要么是一个数字时区,要么是一个特殊字段。 2. 如果令牌是字母字符串,请与可能的字符串匹配: 1. 查看令牌是否与任何已知的时区缩写匹配。这些缩写由中描述的配置文件提供[B.4节](datetime-config-files.html). 2. 如果找不到,请搜索内部表,以将令牌匹配为特殊字符串(例如。,`今天`),天(例如。,`星期四`),月份(例如。,`一月`),或噪音词(例如。,`在`, `在…上`). 3. 如果仍然没有找到,抛出一个错误。 3. 当令牌是数字或数字字段时: 1. 如果有八位或六位数字,并且之前没有读取其他日期字段,则解释为“串联日期”(例如。,`19990118`或`990118`).解释是`YYYYMMDD`或`YYMMDD`. 2. 如果令牌是三位数字,并且已经读取了一年,则解释为一年中的某一天。 3. 如果已经读取了四位或六位数字和一年,则解释为时间(`嗯`或`HHMMS`). 4. 如果还没有找到三位或三位以上的数字,并且没有日期字段,请将其解释为一年(这将强制对剩余的日期字段进行yy-mm-dd排序)。 5. 否则,假定日期字段顺序遵循`日期风格`设置:mm-dd-yy、dd-mm-yy或yy-mm-dd。如果发现月或日字段超出范围,则抛出错误。 4. 如果指定了BC,则取反年份,并为内部存储添加一个。(公历中没有零年,所以从数字上来说,公元前1年就是零年。) 5. 如果未指定BC,并且年份字段的长度为两位数,则将年份调整为四位数。如果字段小于70,则添加2000,否则添加1900. ### 提示 公元1-99年的公历年份可以使用前导零的4位数字输入(例如。,`0099`是公元99年)。