动态标准 — 最后更新于 2024 年 9 月 12 日
HTML 中的多个地方接受特定的数据类型,例如日期或数字。本节描述了这些格式的内容的符合性标准,以及如何解析它们。
强烈建议实现者仔细检查他们可能考虑用来实现下面描述的语法的解析的任何第三方库。例如,日期库很可能实现与本规范中要求不同的错误处理行为,因为错误处理行为通常没有在描述与本规范中使用的类似日期语法的规范中定义,因此实现往往在处理错误的方式上差异很大。
下面描述的一些微解析器遵循以下模式:有一个 input 变量保存要解析的字符串,还有一个 position 变量指向 input 中要解析的下一个字符。
许多属性是 布尔属性。元素上布尔属性的存在表示真值,属性的缺失表示假值。
如果属性存在,它的值必须是空字符串,或者是一个与属性的规范名称进行 ASCII 不区分大小写 匹配的值,且没有前导或尾随空格。
布尔属性不允许使用“true”和“false”值。要表示假值,必须完全省略属性。
以下是一个已选中且禁用的复选框示例。 checked
和 disabled
属性是布尔属性。
< label >< input type = checkbox checked name = cheese disabled > Cheese</ label >
这可以等效地写成:
< label >< input type = checkbox checked = checked name = cheese disabled = disabled > Cheese</ label >
您也可以混合样式;以下仍然是等效的:
< label >< input type = 'checkbox' checked name = cheese disabled = "" > Cheese</ label >
一些属性称为 枚举属性,它们取有限的一组状态。这种属性的状态是通过组合属性的值、规范中给出的关键字/状态映射集以及规范中可能给出的两种特殊状态来获得的。这些特殊状态是 无效值默认值 和 缺失值默认值。
多个关键字可以映射到相同的状态。
空字符串可以是有效的关键字。请注意, 缺失值默认值 仅在属性缺失时适用,而不是在属性存在且值为空字符串时适用。
要确定属性的状态,请执行以下步骤:
如果未指定属性:
如果属性的值与属性定义的其中一个关键字进行 ASCII 不区分大小写 匹配,则返回由该关键字表示的状态。
不返回任何状态。
出于作者符合性目的,如果指定了枚举属性,则属性的值必须与该属性的符合性关键字之一进行 ASCII 不区分大小写 匹配,且没有前导或尾随空格。
出于 反射 目的,任何关键字映射到其上的状态都被认为具有 规范关键字。这可以通过以下方式确定:
如果只有一个关键字映射到给定状态,则该关键字就是它。
如果只有一个符合性关键字映射到给定状态,则该符合性关键字就是它。
否则,状态的规范关键字将在属性规范中明确给出。
如果字符串由一个或多个 ASCII 数字 组成,可选地以 U+002D HYPHEN-MINUS 字符 (-) 为前缀,则该字符串为 有效整数。
没有 U+002D HYPHEN-MINUS (-) 前缀的 有效整数 表示该数字字符串在十进制中的表示。带有 U+002D HYPHEN-MINUS (-) 前缀的 有效整数 表示紧跟在 U+002D HYPHEN-MINUS 后的数字字符串在十进制中的表示,从零中减去。
整数解析规则 如下所示。调用时,必须按照给定的顺序执行这些步骤,并在第一个返回值的步骤中止。此算法将返回整数或错误。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
令 sign 的值为“positive”。
如果 position 超出 input 的末尾,则返回错误。
如果 position 所指的字符(第一个字符)是 U+002D HYPHEN-MINUS 字符 (-)
否则,如果 position 所指的字符(第一个字符)是 U+002B PLUS SIGN 字符 (+)
+
”被忽略,但它不符合规范。)如果 position 所指的字符不是 ASCII 数字,则返回错误。
收集给定 position 的 input 中的 ASCII 数字 的代码点序列,并将得到的序列解释为十进制整数。令 value 为该整数。
如果 sign 为“positive”,则返回 value,否则返回 value 从零中减去的结果。
如果字符串由一个或多个 ASCII 数字 组成,则该字符串为 有效非负整数。
有效非负整数 表示该数字字符串在十进制中的表示。
非负整数解析规则 如下所示。调用时,必须按照给定的顺序执行这些步骤,并在第一个返回值的步骤中止。此算法将返回零、正整数或错误。
令 input 为要解析的字符串。
令 value 为使用 整数解析规则 解析 input 的结果。
如果 value 为错误,则返回错误。
如果 value 小于零,则返回错误。
返回 value。
如果字符串包含以下内容,则该字符串为 有效浮点数:
可选地,U+002D HYPHEN-MINUS 字符 (-)。
以下内容之一或两者,按给定顺序排列:
可选地
U+0065 LATIN SMALL LETTER E 字符 (e) 或 U+0045 LATIN CAPITAL LETTER E 字符 (E)。
可选地,U+002D HYPHEN-MINUS 字符 (-) 或 U+002B PLUS SIGN 字符 (+)。
一个或多个 ASCII 数字 的序列。
一个有效的浮点数表示将有效数字乘以十的指数次方得到的数字,其中有效数字是第一个数字,解释为十进制(包括小数点和小数点后的数字,如果有的话,如果整个字符串以 U+002D HYPHEN-MINUS 字符 (-) 开头并且数字不为零,则将有效数字解释为负数),而指数是在 E 后面的数字,如果有的话(如果 E 和数字之间存在 U+002D HYPHEN-MINUS 字符 (-) 并且数字不为零,则解释为负数,否则忽略 E 和数字之间存在的 U+002B PLUS SIGN 字符 (+))。如果不存在 E,则指数被视为零。
Infinity 和 Not-a-Number (NaN) 值不是有效的浮点数。
有效的浮点数的概念通常仅用于限制作者允许的内容,而用户代理要求使用下面解析浮点数的规则(例如,max
属性,用于progress
元素)。然而,在某些情况下,用户代理要求包括检查字符串是否为有效的浮点数(例如,值清理算法,用于input
元素的Number 状态,或者解析 srcset 属性算法)。
数字 n 的最佳浮点数表示是通过运行ToString(n) 获得的字符串。抽象操作ToString 并不唯一确定。当存在多个可能字符串可以从特定值的ToString 获得时,用户代理必须始终为该值返回相同的字符串(尽管它可能与其他用户代理使用的值不同)。
以下算法给出了解析浮点数的规则。此算法必须在返回内容的第一个步骤处中止。此算法将返回一个数字或错误。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
令 value 的值为 1。
令 divisor 的值为 1。
令 exponent 的值为 1。
跳过 ASCII 空格 在 input 中,给定 position。
如果 position 超出 input 的末尾,则返回错误。
如果 position 指示的字符是 U+002D HYPHEN-MINUS 字符 (-)
否则,如果 position 所指的字符(第一个字符)是 U+002B PLUS SIGN 字符 (+)
+
”被忽略,但它不符合规范。)如果 position 指示的字符是 U+002E FULL STOP (.),并且它不是 input 中的最后一个字符,并且 position 指示的字符后的字符是ASCII 数字,则将 value 设置为零,并跳到标记为 fraction 的步骤。
如果 position 指示的字符不是ASCII 数字,则返回错误。
收集代码点序列,这些代码点是ASCII 数字,从 input 中,给定 position,并将结果序列解释为十进制整数。将 value 乘以该整数。
Fraction:如果 position 指示的字符是 U+002E FULL STOP (.),则运行这些子步骤
将 position 推进到下一个字符。
如果 position 超过了 input 的末尾,或者如果 position 指示的字符不是ASCII 数字、U+0065 LATIN SMALL LETTER E (e) 或 U+0045 LATIN CAPITAL LETTER E (E),则跳到标记为 conversion 的步骤。
如果 position 指示的字符是 U+0065 LATIN SMALL LETTER E 字符 (e) 或 U+0045 LATIN CAPITAL LETTER E 字符 (E),则跳过这些子步骤的其余部分。
Fraction loop:将 divisor 乘以十。
将 position 推进到下一个字符。
如果 position 超过了 input 的末尾,则跳到标记为 conversion 的步骤。
如果 position 指示的字符是ASCII 数字,则跳回这些子步骤中标记为 fraction loop 的步骤。
如果 position 指示的字符是 U+0065 (e) 或 U+0045 (E),则
将 position 推进到下一个字符。
如果 position 超过了 input 的末尾,则跳到标记为 conversion 的步骤。
如果 position 指示的字符是 U+002D HYPHEN-MINUS 字符 (-)
如果 position 超过了 input 的末尾,则跳到标记为 conversion 的步骤。
否则,如果 position 指示的字符是 U+002B PLUS SIGN 字符 (+)
如果 position 超过了 input 的末尾,则跳到标记为 conversion 的步骤。
如果 position 指示的字符不是ASCII 数字,则跳到标记为 conversion 的步骤。
收集代码点序列,这些代码点是ASCII 数字,从 input 中,给定 position,并将结果序列解释为十进制整数。将 exponent 乘以该整数。
将 value 乘以十的 exponent 次方。
Conversion:令 S 为有限 IEEE 754 双精度浮点数集合,不包括 -0,但添加了两个特殊值:21024 和 -21024。
令 rounded-value 为 S 中最接近 value 的数字,如果存在两个同样接近的值,则选择有效数字为偶数的数字。(对于此目的,两个特殊值 21024 和 -21024 被认为具有偶数有效数字。)
如果 rounded-value 为 21024 或 -21024,则返回错误。
返回 rounded-value。
以下算法给出了解析维度值的规则。当被调用时,必须按照给定的顺序执行步骤,在返回值的第一个步骤处中止。此算法将返回一个大于或等于 0.0 的数字,或者失败;如果返回了一个数字,则它进一步被分类为百分比或长度。
令 input 为要解析的字符串。
令 position 为 input 的位置变量,最初指向 input 的开头。
跳过 ASCII 空格 在 input 中,给定 position。
如果 position 超过了 input 的末尾,或者 input 中 position 处的代码点不是ASCII 数字,则返回失败。
收集代码点序列,这些代码点是ASCII 数字,从 input 中,给定 position,并将结果序列解释为十进制整数。令 value 为该数字。
如果 position 超过了 input 的末尾,则返回 value 作为长度。
如果 input 中 position 处的代码点是 U+002E (.),则
返回带有 value、input 和 position 的当前维度值。
给定 value、input 和 position 的当前维度值,如下确定
如果 position 超过了 input 的末尾,则返回 value 作为长度。
如果 input 中 position 处的代码点是 U+0025 (%),则返回 value 作为百分比。
返回 value 作为长度。
以下算法给出了解析非零维度值的规则。当被调用时,必须按照给定的顺序执行步骤,在返回值的第一个步骤处中止。此算法将返回一个大于 0.0 的数字,或者错误;如果返回了一个数字,则它进一步被分类为百分比或长度。
令 input 为要解析的字符串。
令 value 为使用解析维度值的规则 解析 input 的结果。
如果 value 为错误,则返回错误。
如果 value 为零,则返回错误。
如果 value 是一个百分比,则返回 value 作为百分比。
返回 value 作为长度。
一个有效的浮点数列表 是若干有效的浮点数,由 U+002C COMMA 字符隔开,没有其他字符(例如,没有ASCII 空格)。此外,可能对可以给出的浮点数数量或允许的值范围有限制。
解析浮点数列表的规则如下所示
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
令numbers为一个初始为空的浮点数列表。此列表将是此算法的结果。
从给定的position开始,从input中收集一系列代码点,这些代码点是ASCII 空格、U+002C 逗号或 U+003B 分号字符。这将跳过任何前导分隔符。
当position不在input的末尾时
从给定的position开始,从input中收集一系列代码点,这些代码点不是ASCII 空格、U+002C 逗号、U+003B 分号、ASCII 数字、U+002E 句点或 U+002D 连字符字符。这将跳过前导垃圾。
从给定的position开始,从input中收集一系列代码点,这些代码点不是ASCII 空格、U+002C 逗号或 U+003B 分号字符,并令unparsed number为结果。
令number为使用解析浮点数值的规则解析unparsed number的结果。
如果number是错误,则将number设置为零。
将number追加到numbers。
从给定的position开始,从input中收集一系列代码点,这些代码点是ASCII 空格、U+002C 逗号或 U+003B 分号字符。这将跳过分隔符。
返回numbers。
解析尺寸列表的规则如下所示。这些规则返回一个由零个或多个对组成的列表,每个对包含一个数字和一个单位,单位是百分比、相对和绝对之一。
令raw input为正在解析的字符串。
如果raw input中的最后一个字符是 U+002C 逗号字符 (,),则从raw input中删除该字符。
在逗号处分割字符串raw input。令raw tokens为生成的标记列表。
令result为一个空的数字/单位对列表。
对于raw tokens中的每个标记,运行以下子步骤
令input为标记。
令 position 为指向 input 的指针,最初指向字符串的开头。
令value为数字 0。
令unit为绝对。
如果position超过了input的末尾,则将unit设置为相对,并跳转到最后一个子步骤。
如果position处的字符是ASCII 数字,则从给定的position开始,从input中收集一系列代码点,这些代码点是ASCII 数字,将生成的序列解释为十进制整数,并将value增加该整数。
如果position处的字符是 U+002E (.),则
在给定的position处,在input内跳过 ASCII 空格。
如果position处的字符是 U+0025 百分号字符 (%),则将unit设置为百分比。
否则,如果position处的字符是 U+002A 星号字符 (*),则将unit设置为相对。
将一个条目添加到result中,该条目包含由value给出的数字和由unit给出的单位。
返回列表result。
在下述算法中,年份year的月份month中的天数为:如果month为 1、3、5、7、8、10 或 12,则为31;如果month为 4、6、9 或 11,则为30;如果month为 2 且year是 400 的倍数,或者year是 4 的倍数但不是 100 的倍数,则为29;否则为28。这考虑了公历中的闰年。 [GREGORIAN]
当在本节定义的日期和时间语法中使用ASCII 数字时,它们表示十进制数。
虽然此处描述的格式旨在是相应 ISO8601 格式的子集,但本规范对解析规则的定义比 ISO8601 详细得多。因此,鼓励实现者在使用日期解析库实现下述解析规则之前,仔细检查任何日期解析库;ISO8601 库可能不会以完全相同的方式解析日期和时间。 [ISO8601]
在本规范中,当提到推算格里高利历时,指的是现代格里高利历,推算到公元 1 年。推算格里高利历中的日期,有时明确称为推算格里高利日期,是指使用该历法描述的日期,即使该历法当时(或该地点)并未使用。 [GREGORIAN]
在本规范中使用格里高利历作为线格式是一个武断的选择,是由于参与决策者文化偏见所致。另请参阅关于表单中的日期、时间和数字格式(供作者参考)、表单控件本地化的实现说明以及time
元素的部分。
一个月份包含一个特定的推算格里高利日期,不包含时区信息,也不包含年份和月份之外的日期信息。 [GREGORIAN]
如果一个字符串包含以下组件,按给定顺序排列,则该字符串为表示年份year和月份month的有效月份字符串
解析月份字符串的规则如下所示。这将返回一个年份和月份,或者什么也不返回。如果算法在任何时候表示它“失败”,这意味着它在该点中止并返回空值。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
解析月份组件以获取year和month。如果这返回空值,则失败。
如果position不超出input的末尾,则失败。
返回year和month。
解析月份组件的规则如下所示,给定一个input字符串和一个position。这将返回一个年份和月份,或者什么也不返回。如果算法在任何时候表示它“失败”,这意味着它在该点中止并返回空值。
从给定的position开始,从input中收集一系列代码点,这些代码点是ASCII 数字。如果收集的序列长度不足四位,则失败。否则,将生成的序列解释为十进制整数。令该数字为year。
如果year不是大于零的数字,则失败。
如果position超出了input的末尾,或者position处的字符不是 U+002D 连字符,则失败。否则,将position向前移动一位。
从给定的position开始,从input中收集一系列代码点,这些代码点是ASCII 数字。如果收集的序列长度不正好是两位,则失败。否则,将生成的序列解释为十进制整数。令该数字为month。
如果month不是介于 1 ≤ month ≤ 12 范围内的数字,则失败。
返回year和month。
一个日期包含一个特定的推算格里高利日期,不包含时区信息,包含年份、月份和日期。 [GREGORIAN]
如果一个字符串包含以下组件,按给定顺序排列,则该字符串为表示年份year、月份month和日期day的有效日期字符串
解析日期字符串的规则如下所示。这将返回一个日期,或者什么也不返回。如果算法在任何时候表示它“失败”,这意味着它在该点中止并返回空值。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
解析日期组件以获取year、month和day。如果这返回空值,则失败。
如果position不超出input的末尾,则失败。
令date为年份为year、月份为month、日期为day的日期。
返回date。
给定一个 input 字符串和一个 position,解析日期组件的规则如下。这将返回年、月、日,或者什么都不返回。如果算法在任何时候说它“失败”,这意味着它在那个点被中止,什么都不返回。
解析月份组件 以获取 year 和 month。如果这返回空值,则失败。
令 maxday 为 年 year 中 month 月的天数。
如果position超出了input的末尾,或者position处的字符不是 U+002D 连字符,则失败。否则,将position向前移动一位。
收集代码点序列,这些代码点是来自 input 的给定 position 的 ASCII 数字。如果收集的序列不恰好是两个字符长,则失败。否则,将生成的序列解释为十进制整数。让该数字为 day。
如果 day 不是范围 1 ≤ day ≤ maxday 中的数字,则失败。
返回 year、month 和 day。
一个 无年日期 由一个公历月份和该月中的某一天组成,但没有关联年份。 [GREGORIAN]
一个字符串是一个 有效的无年日期字符串,表示月份 month 和日期 day,如果它按给定顺序包含以下组件:
换句话说,如果 month 是“02
”,表示二月,那么日期可以是 29,就像年份是闰年一样。
解析无年日期字符串的规则如下。这将返回月份和日期,或者什么都不返回。如果算法在任何时候说它“失败”,这意味着它在那个点被中止,什么都不返回。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
解析无年日期组件 以获取 month 和 day。如果这返回空值,则失败。
如果position不超出input的末尾,则失败。
返回 month 和 day。
给定一个 input 字符串和一个 position,解析无年日期组件的规则如下。这将返回月份和日期,或者什么都不返回。如果算法在任何时候说它“失败”,这意味着它在那个点被中止,什么都不返回。
收集代码点序列,这些代码点是来自 input 的给定 position 的 U+002D HYPHEN-MINUS 字符 (-)。如果收集的序列不恰好是零个或两个字符长,则失败。
收集代码点序列,这些代码点是来自 input 的给定 position 的 ASCII 数字。如果收集的序列不恰好是两个字符长,则失败。否则,将生成的序列解释为十进制整数。让该数字为 month。
如果month不是介于 1 ≤ month ≤ 12 范围内的数字,则失败。
令 maxday 为 月份 month 和任意闰年(例如 4 或 2000)的天数。
如果position超出了input的末尾,或者position处的字符不是 U+002D 连字符,则失败。否则,将position向前移动一位。
收集代码点序列,这些代码点是来自 input 的给定 position 的 ASCII 数字。如果收集的序列不恰好是两个字符长,则失败。否则,将生成的序列解释为十进制整数。让该数字为 day。
如果 day 不是范围 1 ≤ day ≤ maxday 中的数字,则失败。
返回 month 和 day。
一个 时间 由一个没有时区信息的特定时间组成,包括小时、分钟、秒和秒的几分之一。
一个字符串是一个 有效的日期字符串,表示小时 hour、分钟 minute 和秒 second,如果它按给定顺序包含以下组件:
second 组件不能是 60 或 61;闰秒不能表示。
解析日期字符串的规则如下。这将返回一个时间,或者什么都不返回。如果算法在任何时候说它“失败”,这意味着它在那个点被中止,什么都不返回。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
解析日期组件 以获取 hour、minute 和 second。如果这返回空值,则失败。
如果position不超出input的末尾,则失败。
令 time 为小时为 hour、分钟为 minute 和秒为 second 的时间。
返回 time。
给定一个 input 字符串和一个 position,解析日期组件的规则如下。这将返回小时、分钟和秒,或者什么都不返回。如果算法在任何时候说它“失败”,这意味着它在那个点被中止,什么都不返回。
收集代码点序列,这些代码点是来自 input 的给定 position 的 ASCII 数字。如果收集的序列不恰好是两个字符长,则失败。否则,将生成的序列解释为十进制整数。让该数字为 hour。
如果 position 超出 input 的末尾,或者 position 处的字符不是 U+003A COLON 字符,则失败。否则,将 position 向前移动一个字符。
收集代码点序列,这些代码点是来自 input 的给定 position 的 ASCII 数字。如果收集的序列不恰好是两个字符长,则失败。否则,将生成的序列解释为十进制整数。让该数字为 minute。
令 second 为 0。
如果 position 不超出 input 的末尾,并且 position 处的字符是 U+003A (:),则
将 position 提前到 input 中的下一个字符。
如果 position 超出 input 的末尾,或者在 input 的最后一个字符处,或者如果 input 中从 position 开始的接下来的 *两个* 字符不是都为 ASCII 数字,则失败。
收集代码点序列,这些代码点是来自 input 的给定 position 的 ASCII 数字 或 U+002E FULL STOP 字符。如果收集的序列是三个字符长,或者它超过三个字符长并且第三个字符不是 U+002E FULL STOP 字符,或者它有多个 U+002E FULL STOP 字符,则失败。否则,将生成的序列解释为十进制数字(可能包含小数部分)。将 second 设置为该数字。
如果 second 不是范围 0 ≤ second < 60 中的数字,则失败。
返回 hour、minute 和 second。
一个 本地日期和时间 由一个特定的 前推公历日期 组成,该日期包含年、月和日,以及一个时间,该时间包含小时、分钟、秒和秒的几分之一,但以没有时区的方式表示。 [GREGORIAN]
一个字符串是一个 有效的本地日期和时间字符串,表示日期和时间,如果它按给定顺序包含以下组件:
一个字符串是一个 有效的规范化本地日期和时间字符串,表示日期和时间,如果它按给定顺序包含以下组件:
解析本地日期和时间字符串的规则如下。这将返回日期和时间,或者什么都不返回。如果算法在任何时候说它“失败”,这意味着它在那个点被中止,什么都不返回。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
解析日期组件 以获取 year、month 和 day。如果这返回空值,则失败。
如果 position 超出 input 的末尾,或者 position 处的字符既不是 U+0054 LATIN CAPITAL LETTER T 字符 (T) 也不是 U+0020 SPACE 字符,则失败。否则,将 position 向前移动一个字符。
解析时间组件 以获取 hour、minute 和 second。如果返回空值,则失败。
如果position不超出input的末尾,则失败。
令date为年份为year、月份为month、日期为day的日期。
令 time 为小时为 hour、分钟为 minute 和秒为 second 的时间。
返回 date 和 time。
一个 时区偏移 由带符号的小时数和分钟数组成。
如果一个字符串由以下两种情况组成,则它是一个 有效的时区偏移字符串,表示一个时区偏移。
一个 U+005A 拉丁大写字母 Z 字符 (Z),仅当时区为 UTC 时才允许
或者,以下组件,按照给定的顺序
此格式允许时区偏移从 -23:59 到 +23:59。目前,在实践中,实际时区的偏移范围是 -12:00 到 +14:00,并且实际时区的偏移分钟部分始终为 00、30 或 45 之一。但是,不能保证这种情况会永远持续下去,因为时区被用作政治足球,因此会受到非常反复无常的政策决策的影响。
另请参阅下方 全局日期和时间 部分中的使用说明和示例,了解有关将时区偏移与早于正式时区形成的历史时间一起使用的详细信息。
以下规则用于 解析时区偏移字符串。这将返回一个时区偏移,或者返回空值。如果算法在任何时候表示它“失败”,则意味着它在该点中止并返回空值。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
解析时区偏移组件 以获取 timezonehours 和 timezoneminutes。如果返回空值,则失败。
如果position不超出input的末尾,则失败。
返回相对于 UTC timezonehours 小时和 timezoneminutes 分钟的时区偏移。
以下规则用于 解析时区偏移组件,给定一个 input 字符串和一个 position。这将返回时区小时数和时区分钟数,或者返回空值。如果算法在任何时候表示它“失败”,则意味着它在该点中止并返回空值。
如果 position 处的字符是 U+005A 拉丁大写字母 Z 字符 (Z),则
令 timezonehours 为 0。
令 timezoneminutes 为 0。
将 position 提前到 input 中的下一个字符。
否则,如果 position 处的字符是 U+002B 加号 (+) 或 U+002D 连字符 (-),则
如果 position 处的字符是 U+002B 加号 (+),则令 sign 为“positive”。否则,它是一个 U+002D 连字符 (-);令 sign 为“negative”。
将 position 提前到 input 中的下一个字符。
如果 s 正好有两个字符长,则
将 s 解释为十进制整数。令该数字为 timezonehours。
如果 position 超出 input 的末尾,或者 position 处的字符不是 U+003A COLON 字符,则失败。否则,将 position 向前移动一个字符。
收集代码点序列,这些代码点是给定 position 的 input 中的 ASCII 数字。如果收集的序列不是正好两个字符长,则失败。否则,将结果序列解释为十进制整数。令该数字为 timezoneminutes。
如果 s 正好有四个字符长,则
将 s 的前两个字符解释为十进制整数。令该数字为 timezonehours。
将 s 的后两个字符解释为十进制整数。令该数字为 timezoneminutes。
否则,失败。
否则,失败。
返回 timezonehours 和 timezoneminutes。
一个 全局日期和时间 由一个特定的 推算格里高利日期 组成,该日期包含年份、月份和日期,以及一个时间,包含小时、分钟、秒和小数秒,并用一个时区偏移表示,该偏移包含带符号的小时数和分钟数。 [GREGORIAN]
如果一个字符串由以下组件按给定的顺序组成,则它是一个 有效的全局日期和时间字符串,表示日期、时间和时区偏移。
在二十世纪中期 UTC 形成之前日期的时间必须用 UT1 (格林威治时间子午线上的当代地球太阳时间) 而不是 UTC (UT1 的近似值,以 SI 秒为单位) 表示和解释。在形成时区之前的时间必须用 UT1 时间表示和解释,并使用明确的时区,这些时区近似于适当的当地时间与伦敦格林威治观测时间之间的当代差异。
以下是作为 有效的全局日期和时间字符串 编写的日期的一些示例。
0037-12-13 00:00Z
"1979-10-14T12:00:00.001-04:00
"8592-01-01T02:09+02:09
"这些日期有一些值得注意的地方
T
”被空格替换,它必须是单个空格字符。字符串“2001-12-21 12:00Z
”(组件之间有两个空格)将无法解析成功。以下规则用于 解析全局日期和时间字符串。这将返回 UTC 中的时间,以及与之关联的时区偏移信息,以便进行往返操作或显示。如果算法在任何时候表示它“失败”,则意味着它在该点中止并返回空值。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
解析日期组件 以获取 year、month 和 day。如果返回空值,则失败。
如果 position 超出 input 的末尾,或者 position 处的字符既不是 U+0054 LATIN CAPITAL LETTER T 字符 (T) 也不是 U+0020 SPACE 字符,则失败。否则,将 position 向前移动一个字符。
解析时间组件 以获取 hour、minute 和 second。如果返回空值,则失败。
如果 position 超过 input 的末尾,则失败。
解析时区偏移组件 以获取 timezonehours 和 timezoneminutes。如果返回空值,则失败。
如果position不超出input的末尾,则失败。
令 time 为年份为 year、月份为 month、日期为 day、小时为 hour、分钟为 minute、秒为 second 的时间点,减去 timezonehours 小时和 timezoneminutes 分钟。该时间点是 UTC 时区中的一个时间点。
令 timezone 为相对于 UTC timezonehours 小时和 timezoneminutes 分钟的时区。
返回 time 和 timezone。
一个 周 由周年的编号和周编号组成,该周编号代表从星期一开始的七天周期。此日历系统中的每个周年都包含 52 或 53 个这样的七天周期,定义如下。从 1969 年 12 月 29 日(1969-12-29)星期一格里高利日期开始的七天周期被定义为 1970 年周年的第 1 周。连续的周按顺序编号。周年内第 1 周之前的周是前一周年的最后一周,反之亦然。 [GREGORIAN]
如果一个周年编号为 year,并且它对应于 推算格里高利历 中的第一天(1 月 1 日)为星期四的年份 year,或者对应于 推算格里高利历 中的第一天(1 月 1 日)为星期三的年份 year 且 year 可被 400 整除,或可被 4 整除但不能被 100 整除,则该周年包含 53 周。所有其他周年都包含 52 周。
包含 53 周的周年的 最后一天的周编号 为 53;包含 52 周的周年的最后一天的周编号为 52。
特定日期的周年编号可能与包含该日期的 推算格里高利历 中的年份编号不同。周年 y 中的第一周是包含格里高利年份 y 中的第一个星期四的周。
对于现代用途,此处定义的周等同于ISO 8601中定义的ISO周。[ISO8601]
如果一个字符串由以下组件按顺序组成,则它是一个表示周年的year和周数week的有效周字符串
解析周字符串的规则如下。这将返回一个周年数和周数,或者什么也不返回。如果在任何时候算法说它“失败”,这意味着它在该点中止并返回空值。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
从给定position的input中收集一系列代码点,这些代码点是ASCII数字。如果收集的序列长度不足四位字符,则失败。否则,将结果序列解释为十进制整数。让该数字为year。
如果year不是大于零的数字,则失败。
如果position超出了input的末尾,或者position处的字符不是 U+002D 连字符,则失败。否则,将position向前移动一位。
如果position超出input的末尾,或者position处的字符不是U+0057拉丁大写字母W字符(W),则失败。否则,将position向前移动一个字符。
从给定position的input中收集一系列代码点,这些代码点是ASCII数字。如果收集的序列长度不正好是两位字符,则失败。否则,将结果序列解释为十进制整数。让该数字为week。
让maxweek是year的最后一天的周数。
如果week不是范围为1 ≤ week ≤ maxweek的数字,则失败。
如果position不超出input的末尾,则失败。
返回周年数year和周数week。
一个时长包含一定数量的秒数。
由于月份和秒数不可比较(一个月不是确切的秒数,而是一个周期,其确切长度取决于测量的精确日期),本规范中定义的时长不能包含月份(或年份,它们相当于12个月)。只能描述以特定秒数描述的时长。
如果一个字符串由以下任一组成,则它是一个表示时长t的有效时长字符串
一个文字U+0050拉丁大写字母P字符,后跟一个或多个以下子组件,按给定顺序排列,其中天数、小时数、分钟数和秒数与t中的相同秒数相对应
一个或多个ASCII数字,后跟一个U+0044拉丁大写字母D字符,表示天数。
一个U+0054拉丁大写字母T字符,后跟一个或多个以下子组件,按给定顺序排列
这与本规范中定义的许多其他日期和时间相关微语法一样,基于ISO 8601中定义的格式之一。[ISO8601]
一个或多个时长时间组件,每个组件都有不同的时长时间组件比例,可以按任意顺序排列;表示的秒数之和等于t中的秒数。
一个时长时间组件是一个由以下组件组成的字符串
零个或多个ASCII空格。
如果指定的时长时间组件比例为1(即单位为秒),则可选地,一个U+002E句号字符(.),后跟一个、两个或三个ASCII数字,表示秒的分数。
零个或多个ASCII空格。
以下字符之一,表示时长时间组件的数字部分中使用的时长时间组件比例
零个或多个ASCII空格。
这没有基于ISO 8601中的任何格式。它旨在成为ISO 8601时长格式更人性化的替代方案。
解析时长字符串的规则如下。这将返回一个时长,或者什么也不返回。如果在任何时候算法说它“失败”,这意味着它在该点中止并返回空值。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
让months、seconds和component count都为零。
让M-disambiguator为minutes。
此标志的另一个值为months。它用于消除ISO8601时长中“M”单位的歧义,该单位在月份和分钟中使用相同的单位。不允许使用月份,但会解析以确保将来兼容性,并避免误解在其他上下文中有效的ISO8601时长。
从给定position的input中跳过ASCII空格。
如果position超过input的末尾,则失败。
如果position指向的input中的字符是U+0050拉丁大写字母P字符,则将position推进到下一个字符,将M-disambiguator设置为months,并从给定position的input中跳过ASCII空格。
当为真时
让units未定义。它将被分配以下值之一:years、months、weeks、days、hours、minutes和seconds。
让next character未定义。它用于处理来自input的字符。
如果position超过input的末尾,则中断。
如果position指向的input中的字符是U+0054拉丁大写字母T字符,则将position推进到下一个字符,将M-disambiguator设置为minutes,从给定position的input中跳过ASCII空格,并继续。
将next character设置为position指向的input中的字符。
如果next character是U+002E句号字符(.),则让N等于零。(不要推进position。这将在下面处理。)
否则,如果next character是ASCII数字,则从给定position的input中收集一系列代码点,这些代码点是ASCII数字,将结果序列解释为十进制整数,并让N为该数字。
否则,next character不是数字的一部分;失败。
如果position超过input的末尾,则失败。
将next character设置为position指向的input中的字符,这次将position推进到下一个字符。(如果next character之前是U+002E句号字符(.),它这次仍然是该字符。)
如果next character是U+002E(.),则
如果s为空字符串,则失败。
让length为s中的字符数。
令fraction为将s解释为十进制整数,然后将该数字除以10length的结果。
将N增加fraction。
从给定position的input中跳过ASCII空格。
如果position超过input的末尾,则失败。
将next character设置为position指向的input中的字符,并将position推进到下一个字符。
如果next character既不是U+0053拉丁大写字母S字符,也不是U+0073拉丁小写字母S字符,则失败。
将units设置为seconds。
否则
如果next character是ASCII空格,则从给定position的input中跳过ASCII空格,将next character设置为position指向的input中的字符,并将position推进到下一个字符。
如果next character是U+0059拉丁大写字母Y字符或U+0079拉丁小写字母Y字符,则将units设置为years,并将M-disambiguator设置为months。
如果next character是U+004D拉丁大写字母M字符或U+006D拉丁小写字母M字符,并且M-disambiguator是months,则将units设置为months。
如果下一个字符是 U+0057 拉丁大写字母 W 字符或 U+0077 拉丁小写字母 W 字符,则将单位设置为周并将M-消歧符设置为分钟。
如果下一个字符是 U+0044 拉丁大写字母 D 字符或 U+0064 拉丁小写字母 D 字符,则将单位设置为天并将M-消歧符设置为分钟。
如果下一个字符是 U+0048 拉丁大写字母 H 字符或 U+0068 拉丁小写字母 H 字符,则将单位设置为小时并将M-消歧符设置为分钟。
如果下一个字符是 U+004D 拉丁大写字母 M 字符或 U+006D 拉丁小写字母 M 字符,并且M-消歧符是分钟,则将单位设置为分钟。
如果下一个字符是 U+0053 拉丁大写字母 S 字符或 U+0073 拉丁小写字母 S 字符,则将单位设置为秒并将M-消歧符设置为分钟。
否则,如果下一个字符不是以上字符,则失败。
增加组件计数。
令乘数为 1。
如果单位是年,则将乘数乘以 12 并将单位设置为月。
如果单位是月,则将N和乘数的乘积加到月。
否则
如果单位是周,则将乘数乘以 7 并将单位设置为天。
如果单位是天,则将乘数乘以 24 并将单位设置为小时。
如果单位是小时,则将乘数乘以 60 并将单位设置为分钟。
如果单位是分钟,则将乘数乘以 60 并将单位设置为秒。
强制性地,单位现在是秒。将N和乘数的乘积加到秒。
跳过 ASCII 空白符在给定位置的输入中。
如果组件计数为零,则失败。
如果月不为零,则失败。
返回由秒秒组成的持续时间。
如果一个字符串也是以下字符串之一,则它是一个包含可选时间的有效日期字符串
解析日期或时间字符串的规则如下。该算法将返回一个日期、一个时间、一个全局日期和时间,或无。如果在任何时候算法说它“失败”,这意味着它在该点中止并返回无。
令 input 为要解析的字符串。
令 position 为指向 input 的指针,最初指向字符串的开头。
将开始位置设置为与位置相同的位置。
将日期存在和时间存在标志设置为真。
解析日期组件以获取年、月和日。如果失败,则将日期存在标志设置为假。
如果日期存在为真,并且位置没有超过输入的结尾,并且位置处的字符是 U+0054 拉丁大写字母 T 字符(T)或 U+0020 空格字符,则将位置推进到输入中的下一个字符。
否则,如果日期存在为真,并且位置超过输入的结尾或位置处的字符既不是 U+0054 拉丁大写字母 T 字符(T)也不是 U+0020 空格字符,则将时间存在设置为假。
否则,如果日期存在为假,则将位置恢复到与开始位置相同的位置。
如果时间存在标志为真,则解析时间组件以获取小时、分钟和秒。如果这返回无,则失败。
如果日期存在和时间存在标志都为真,但位置超过输入的结尾,则失败。
如果日期存在和时间存在标志都为真,解析时区偏移组件以获取时区小时和时区分钟。如果这返回无,则失败。
如果position不超出input的末尾,则失败。
如果日期存在标志为真而时间存在标志为假,则令日期为年为年、月为月、日为日的日期,并返回日期。
否则,如果时间存在标志为真而日期存在标志为假,则令时间为小时为小时、分钟为分钟、秒为秒的时间,并返回时间。
否则,令时间为年为年、月为月、日为日、小时为小时、分钟为分钟、秒为秒的时间,减去时区小时小时和时区分钟分钟,该时间点为 UTC 时区的时刻;令时区为距 UTC 时区小时小时和时区分钟分钟;并返回时间和时区。
一个简单颜色由三个 8 位数字组成,范围在 0 到 255 之间(含),分别代表颜色的红色、绿色和蓝色分量,以'srgb'颜色空间表示。
如果一个字符串恰好包含七个字符,并且第一个字符是 U+0023 数字符号字符 (#),并且其余六个字符都是ASCII 十六进制数字,则该字符串是一个有效的简单颜色,其中前两位数字表示红色分量,中间两位数字表示绿色分量,最后两位数字表示蓝色分量,以十六进制表示。
如果一个字符串是一个有效的简单颜色并且不使用 U+0041 拉丁大写字母 A 到 U+0046 拉丁大写字母 F 范围内的任何字符,则它是一个有效的简单颜色。
以下算法给出了解析简单颜色值的规则。调用时,必须按给定的顺序执行步骤,在第一个返回值的步骤处中止。该算法将返回一个简单颜色或错误。
令 input 为要解析的字符串。
如果输入不恰好包含七个字符,则返回错误。
如果输入中的第一个字符不是 U+0023 数字符号字符 (#),则返回错误。
如果输入的最后六个字符不是全部ASCII 十六进制数字,则返回错误。
令结果为一个简单颜色。
将第二个和第三个字符解释为十六进制数字,并令结果为结果的红色分量。
将第四个和第五个字符解释为十六进制数字,并令结果为结果的绿色分量。
将第六个和第七个字符解释为十六进制数字,并令结果为结果的蓝色分量。
返回结果。
以下算法给出了给定简单颜色的序列化简单颜色值的规则
令结果为包含单个 U+0023 数字符号字符 (#) 的字符串。
将红色、绿色和蓝色分量依次转换为两位十六进制数字,使用ASCII 小写十六进制数字,如果需要则用零填充,并将这些数字追加到结果,顺序为红色、绿色、蓝色。
返回结果,它将是一个有效的简单颜色。
一些过时的遗留属性使用更复杂的方式解析颜色,使用解析遗留颜色值的规则,这些规则在以下算法中给出。调用时,必须按给定的顺序执行步骤,在第一个返回值的步骤处中止。该算法将返回一个简单颜色或错误。
令 input 为要解析的字符串。
如果输入是空字符串,则返回错误。
如果输入与字符串“transparent
”的ASCII 不区分大小写匹配,则返回错误。
如果输入与命名颜色之一的ASCII 不区分大小写匹配,则返回与该关键字相对应的简单颜色。 [CSSCOLOR]
不识别CSS2 系统颜色。
如果输入的代码点长度为四,并且输入中的第一个字符是 U+0023 (#),并且输入的最后三个字符都是ASCII 十六进制数字,则
令结果为一个简单颜色。
将输入的第二个字符解释为十六进制数字;令结果的红色分量为所得数字乘以 17。
将输入的第三个字符解释为十六进制数字;令结果的绿色分量为所得数字乘以 17。
将输入的第四个字符解释为十六进制数字;令结果的蓝色分量为所得数字乘以 17。
返回结果。
用两位字符字符串“00
”替换输入中大于 U+FFFF 的任何代码点(即,任何不在基本多语言平面的字符)。
如果输入的代码点长度大于 128,则截断输入,只保留前 128 个字符。
如果输入中的第一个字符是 U+0023 数字符号字符 (#),则将其删除。
用 U+0030 数字零 (0) 字符替换输入中不是ASCII 十六进制数字的任何字符。
当输入的代码点长度为零或不是 3 的倍数时,在输入的末尾追加一个 U+0030 数字零 (0) 字符。
将输入分成三个代码点长度相等的字符串,以获得三个分量。令长度为这些分量都具有的代码点长度(输入的代码点长度的三分之一)。
如果长度大于 8,则删除每个分量中的前长度-8个字符,并将长度设为 8。
当 length 大于 2 且每个组件的第一个字符是 U+0030 数字零 (0) 字符时,删除该字符并将 length 减 1。
如果 length 仍然大于 2,则截断每个组件,仅保留每个组件的前两个字符。
令 result 为一个 简单颜色。
将第一个组件解释为十六进制数;令 result 的红色分量为结果数。
将第二个组件解释为十六进制数;令 result 的绿色分量为结果数。
将第三个组件解释为十六进制数;令 result 的蓝色分量为结果数。
返回结果。
2D 图形上下文 具有单独的颜色语法,也处理不透明度。
一个 以空格分隔的标记集 是一个字符串,包含零个或多个单词(称为标记),这些单词由一个或多个 ASCII 空白 分隔,其中单词由一个或多个字符组成,没有一个是 ASCII 空白。
包含一个 以空格分隔的标记集 的字符串可能具有前导或尾随 ASCII 空白。
一个 无序的唯一以空格分隔的标记集 是一个 以空格分隔的标记集,其中没有标记重复。
一个 有序的唯一以空格分隔的标记集 是一个 以空格分隔的标记集,其中没有标记重复,但标记的顺序是有意义的。
以空格分隔的标记集 有时具有定义的一组允许的值。当定义了一组允许的值时,所有标记必须来自该允许值列表;其他值是非符合的。如果没有提供这样的允许值集,则所有值都符合。
如何比较 以空格分隔的标记集 中的标记(例如,区分大小写或不区分大小写)是在每个集合的基础上定义的。
一个 以逗号分隔的标记集 是一个字符串,包含零个或多个标记,每个标记由单个 U+002C 逗号字符 (,) 分隔,其中标记由零个或多个字符组成,既不以 ASCII 空白 开头也不以 ASCII 空白 结尾,也不包含任何 U+002C 逗号字符 (,),并且可以选择用 ASCII 空白 括起来。
例如,字符串 " a ,b,,d d
" 包含四个标记:"a"、"b"、空字符串和 "d d"。每个标记周围的前导和尾随空格不计为标记的一部分,空字符串可以是标记。
以逗号分隔的标记集 有时对构成有效标记的内容有进一步的限制。当定义了这样的限制时,所有标记必须符合这些限制;其他值是非符合的。如果没有指定这样的限制,则所有值都符合。
对类型为 type 的元素的 有效哈希名称引用 是一个字符串,它由一个 U+0023 数字符号字符 (#) 后跟一个字符串组成,该字符串与同一 树 中类型为 type 的元素的 name
属性的值完全匹配。
给定上下文节点 scope,对类型为 type 的元素的 解析哈希名称引用的规则 如下所示
如果被解析的字符串不包含 U+0023 数字符号字符,或者如果字符串中的第一个此类字符是字符串中的最后一个字符,则返回 null。
令 s 为从被解析字符串中的第一个 U+0023 数字符号字符后的字符到该字符串结尾的字符串。
返回 scope 的 树 中的第一个类型为 type 的元素,在 树序 中,其 id
或 name
属性的值为 s,或者如果不存在这样的元素,则返回 null。
虽然 id
属性在解析时会考虑在内,但它们不会用于确定某个值是否为 有效哈希名称引用。也就是说,根据 id
引用元素的哈希名称引用是一个符合性错误(除非该元素也具有与该值相同的 name
属性)。
如果某个字符串与 Media Queries 中的 <media-query-list>
产生式匹配,则该字符串为 有效的媒体查询列表。 [MQ]
如果某个字符串为空字符串,仅包含 ASCII 空白 的字符串,或者是一个根据 Media Queries 中给出的定义与用户环境匹配的媒体查询列表,则该字符串 与用户的环境匹配。 [MQ]
一个 唯一的内部值 是一个可序列化、按值可比较的值,并且从未暴露给脚本。
要创建一个 新的唯一的内部值,请返回一个 唯一的内部值,该值从未通过此算法返回过。