21 数字与日期 (Numbers and Dates)

21.1 Number 对象 (Number Objects)

21.1.1 Number 构造函数 (The Number Constructor)

Number 构造函数

  • %Number%
  • 是全局对象 "Number" 属性的初始值。
  • 作为构造函数调用时创建并初始化一个新的 Number 对象。
  • 作为函数而非构造函数调用时执行一次类型转换。
  • 可用作类定义的 extends 子句取值。想要继承指定 Number 行为的子类构造函数必须包含对 Number 构造函数super 调用,以创建并初始化带有 [[NumberData]] 内部槽的子类实例。

21.1.1.1 Number ( value )

该函数被调用时执行以下步骤:

  1. 如果提供了 value,则
    1. prim 为 ? ToNumeric(value)。
    2. 如果 prim 是 BigInt,令 n𝔽((prim))。
    3. 否则,令 nprim
  2. 否则,
    1. n+0𝔽
  3. 如果 NewTarget 是 undefined,返回 n
  4. O 为 ? OrdinaryCreateFromConstructor(NewTarget, "%Number.prototype%", « [[NumberData]] »)。
  5. O.[[NumberData]]n
  6. 返回 O

21.1.2 Number 构造函数的属性 (Properties of the Number Constructor)

Number 构造函数

21.1.2.1 Number.EPSILON

Number.EPSILON 的值是 Number 值 1 与大于 1 的最小可表示 Number 值之间差值的数量级,对应约 2.2204460492503130808472633361816 × 10-16

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.2 Number.isFinite ( number )

该函数被调用时执行以下步骤:

  1. 如果 number 不是 Number,返回 false
  2. 如果 number 不是有限值,返回 false
  3. 否则,返回 true

21.1.2.3 Number.isInteger ( number )

该函数被调用时执行以下步骤:

  1. 如果 number 是一个整数的 Number,返回 true
  2. 返回 false

21.1.2.4 Number.isNaN ( number )

该函数被调用时执行以下步骤:

  1. 如果 number 不是 Number,返回 false
  2. 如果 numberNaN,返回 true
  3. 否则,返回 false
Note

该函数不同于全局 isNaN 函数 (19.2.3),因为它在判断是否为 NaN 前不会将其参数转换为 Number。

21.1.2.5 Number.isSafeInteger ( number )

Note

整数 n 是“安全整数 (safe integer)”当且仅当 n 的 Number 值不与任何其他整数的 Number 值相同。

该函数被调用时执行以下步骤:

  1. 如果 number 是一个整数的 Number,则
    1. 如果 abs((number)) ≤ 253 - 1,返回 true
  2. 返回 false

21.1.2.6 Number.MAX_SAFE_INTEGER

Note

由于 IEEE 754-2019 精度限制导致的舍入行为,所有大于 Number.MAX_SAFE_INTEGER 的整数的 Number 值至少与另一个整数共享。此类大幅度整数因此不是 安全 的,不能保证精确表示为 Number 值,甚至不能保证彼此可区分。例如,90071992547409929007199254740993 都求值为 Number 值 9007199254740992𝔽

Number.MAX_SAFE_INTEGER 的值是 9007199254740991𝔽 (𝔽(253 - 1))。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.7 Number.MAX_VALUE

Number.MAX_VALUE 的值是 Number 类型的最大正有限值,约为 1.7976931348623157 × 10308

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.8 Number.MIN_SAFE_INTEGER

Note

由于 IEEE 754-2019 精度限制导致的舍入行为,所有小于 Number.MIN_SAFE_INTEGER 的整数的 Number 值至少与另一个整数共享。此类大幅度整数因此不是 安全 的,不能保证精确表示为 Number 值,甚至不能保证彼此可区分。例如,-9007199254740992-9007199254740993 都求值为 Number 值 -9007199254740992𝔽

Number.MIN_SAFE_INTEGER 的值是 -9007199254740991𝔽 (𝔽(-(253 - 1)))。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.9 Number.MIN_VALUE

Number.MIN_VALUE 的值是 Number 类型最小的正值,约为 5 × 10-324

IEEE 754-2019 双精度二进制表示中,最小可能值是一个非规范化数。如果实现不支持非规范化值,则 Number.MIN_VALUE 的值必须是该实现实际可表示的最小非零正值。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.10 Number.NaN

Number.NaN 的值是 NaN

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.11 Number.NEGATIVE_INFINITY

Number.NEGATIVE_INFINITY 的值是 -∞𝔽

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.12 Number.parseFloat ( string )

"parseFloat" 属性的初始值是 %parseFloat%

21.1.2.13 Number.parseInt ( string, radix )

"parseInt" 属性的初始值是 %parseInt%

21.1.2.14 Number.POSITIVE_INFINITY

Number.POSITIVE_INFINITY 的值是 +∞𝔽

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.15 Number.prototype

Number.prototype 的初始值是 Number 原型对象。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.3 Number 原型对象的属性 (Properties of the Number Prototype Object)

Number 原型对象

  • %Number.prototype%
  • 是一个普通对象
  • 其自身是一个 Number 对象;具有值为 +0𝔽[[NumberData]] 内部槽。
  • 具有 [[Prototype]] 内部槽,其值为 %Object.prototype%

除非明确另行说明,下面定义的 Number 原型对象的方法不是通用的;传递给它们的 this 值必须是一个 Number 值,或一个带有已初始化为 Number 值的 [[NumberData]] 内部槽的对象。

在某个方法的规范中,“this Number 值”指调用抽象操作 ThisNumberValue 并以该方法调用的 this 值作为实参所返回的结果。

21.1.3.1 Number.prototype.constructor

Number.prototype.constructor 的初始值是 %Number%

21.1.3.2 Number.prototype.toExponential ( fractionDigits )

该方法返回一个 String,内容为此 Number 值按十进制指数表示法表示,尾数小数点前一位,且小数点后有 fractionDigits 位。如果 fractionDigitsundefined,则包含区分该 Number 所需的尽可能多的尾数字符(类似 ToString,只是此处始终用指数表示法)。

被调用时执行以下步骤:

  1. x 为 ? ThisNumberValue(this value)。
  2. f 为 ? ToIntegerOrInfinity(fractionDigits)。
  3. 断言:若 fractionDigitsundefined,则 f 为 0。
  4. 如果 x 不是有限值,返回 Number::toString(x, 10)。
  5. 如果 f < 0 或 f > 100,抛出 RangeError 异常。
  6. x(x)。
  7. s 为空字符串。
  8. x < 0,则
    1. s"-"
    2. x 为 -x
  9. x = 0,则
    1. m 为包含 f + 1 个代码单元 0x0030 (DIGIT ZERO) 的 String。
    2. e 为 0。
  10. 否则,
    1. fractionDigits 不为 undefined,则
      1. en 为整数,满足 10fn < 10f + 1n × 10e - f - x 尽可能接近 0。若存在两个满足条件的 (e, n),选择使 n × 10e - f 较大的那一组。
    2. 否则,
      1. enff 为整数,满足 ff ≥ 0,10ffn < 10ff + 1𝔽(n × 10e - ff) 为 𝔽(x),且 ff 尽可能小。注意:n 的十进制表示有 ff + 1 位,n 不可被 10 整除,并且 n 的最低有效位不一定唯一确定。
      2. fff
    3. mn 十进制表示的数字(按顺序,无前导零)组成的 String。
  11. f ≠ 0,则
    1. am 的第一个代码单元。
    2. bm 的其余 f 个代码单元。
    3. ma"."b 的串联。
  12. e = 0,则
    1. c"+"
    2. d"0"
  13. 否则,
    1. e > 0,则
      1. c"+"
    2. 否则,
      1. 断言:e < 0。
      2. c"-"
      3. e 为 -e
    3. de 十进制表示数字(按顺序,无前导零)组成的 String。
  14. mm"e"cd 的串联。
  15. 返回 sm 的串联。
Note

对于提供比上述规则更高精度转换的实现,建议使用下列替代版本的步骤 10.b.i 作为指导:

  1. enf 为整数,满足 f ≥ 0,10fn < 10f + 1𝔽(n × 10e - f) 为 𝔽(x),且 f 尽可能小。若 n 存在多个可能值,选择使 𝔽(n × 10e - f) 与 𝔽(x) 最接近的 n;若有两个这样的 n,选择偶数的那个。

21.1.3.3 Number.prototype.toFixed ( fractionDigits )

Note 1

该方法返回一个 String,内容为此 Number 值按十进制定点表示法表示,在小数点后有 fractionDigits 位。如果 fractionDigitsundefined,则假定为 0。

被调用时执行以下步骤:

  1. x 为 ? ThisNumberValue(this value)。
  2. f 为 ? ToIntegerOrInfinity(fractionDigits)。
  3. 断言:若 fractionDigitsundefined,则 f 为 0。
  4. 如果 f 不是有限值,抛出 RangeError 异常。
  5. 如果 f < 0 或 f > 100,抛出 RangeError 异常。
  6. 如果 x 不是有限值,返回 Number::toString(x, 10)。
  7. x(x)。
  8. s 为空字符串。
  9. x < 0,则
    1. s"-"
    2. x 为 -x
  10. x ≥ 1021,则
    1. m 为 ! ToString(𝔽(x))。
  11. 否则,
    1. n 为整数,使得 n / 10f - x 尽可能接近 0。若有两个这样的 n,取较大的。
    2. n = 0,令 m"0";否则令 mn 十进制表示数字(按顺序,无前导零)组成的 String。
    3. f ≠ 0,则
      1. km 的长度。
      2. kf,则
        1. z 为包含 f + 1 - k 个代码单元 0x0030 (DIGIT ZERO) 的 String。
        2. mzm 的串联。
        3. kf + 1。
      3. am 的前 k - f 个代码单元。
      4. bm 其余 f 个代码单元。
      5. ma"."b 的串联。
  12. 返回 sm 的串联。
Note 2

toFixed 的输出在某些值上可能比 toString 更精确,因为 toString 只打印区分该数字与相邻 Number 值所需的有效数字。例如:

(1000000000000000128).toString() 返回 "1000000000000000100",而
(1000000000000000128).toFixed(0) 返回 "1000000000000000128"

21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按 ECMA-402 规范实现此方法。若实现不包含 ECMA-402 API,则使用下列规范:

此方法生成一个 String,表示此 Number 值,按宿主环境当前语言环境的约定格式化。该方法是实现定义的;允许(但不鼓励)它返回与 toString 相同的结果。

此方法可选参数的意义在 ECMA-402 规范中定义;不包含 ECMA-402 支持的实现不得将这些参数位置用于其他目的。

21.1.3.5 Number.prototype.toPrecision ( precision )

该方法返回一个 String,内容为此 Number 值:要么使用十进制指数表示法(尾数小数点前 1 位,后面有 precision - 1 位),要么使用十进制定点表示法(共 precision 个有效数字)。如果 precisionundefined,则调用 ToString

被调用时执行以下步骤:

  1. x 为 ? ThisNumberValue(this value)。
  2. 如果 precisionundefined,返回 ! ToString(x)。
  3. p 为 ? ToIntegerOrInfinity(precision)。
  4. 如果 x 不是有限值,返回 Number::toString(x, 10)。
  5. 如果 p < 1 或 p > 100,抛出 RangeError 异常。
  6. x(x)。
  7. s 为空字符串。
  8. x < 0,则
    1. s 为代码单元 0x002D (HYPHEN-MINUS)。
    2. x 为 -x
  9. x = 0,则
    1. m 为包含 p 个代码单元 0x0030 (DIGIT ZERO) 的 String。
    2. e 为 0。
  10. 否则,
    1. en 为整数,满足 10p - 1n < 10pn × 10e - p + 1 - x 尽可能接近 0。若存在两个满足条件的 (e, n),选择使 n × 10e - p + 1 较大的那一组。
    2. mn 十进制表示数字(按顺序,无前导零)组成的 String。
    3. e < -6 或 ep,则
      1. 断言:e ≠ 0。
      2. p ≠ 1,则
        1. am 的第一个代码单元。
        2. bm 的其余 p - 1 个代码单元。
        3. ma"."b 的串联。
      3. e > 0,则
        1. c 为代码单元 0x002B (PLUS SIGN)。
      4. 否则,
        1. 断言:e < 0。
        2. c 为代码单元 0x002D (HYPHEN-MINUS)。
        3. e 为 -e
      5. de 十进制表示数字(按顺序,无前导零)组成的 String。
      6. 返回 sm、代码单元 0x0065 (LATIN SMALL LETTER E)、cd 的串联。
  11. e = p - 1,返回 sm 的串联。
  12. e ≥ 0,则
    1. m 为:m 的前 e + 1 个代码单元、代码单元 0x002E (FULL STOP)、以及剩余 p - (e + 1) 个代码单元的串联。
  13. 否则,
    1. m 为:代码单元 0x0030 (DIGIT ZERO)、代码单元 0x002E (FULL STOP)、-(e + 1) 个代码单元 0x0030 (DIGIT ZERO)、以及字符串 m 的串联。
  14. 返回 sm 的串联。

21.1.3.6 Number.prototype.toString ( [ radix ] )

Note

可选的 radix 应是区间 2𝔽36𝔽(含)内的整数 Number。若 radixundefined 则其值取 10𝔽

该方法被调用时执行以下步骤:

  1. x 为 ? ThisNumberValue(this value)。
  2. radixundefined,令 radixMV 为 10。
  3. 否则,令 radixMV 为 ? ToIntegerOrInfinity(radix)。
  4. radixMV 不在 2 到 36 的区间内(含端点),抛出 RangeError 异常。
  5. 返回 Number::toString(x, radixMV)。

该方法不是通用的;如果其 this 值不是一个 Number 或 Number 对象则抛出 TypeError。因此它不能被转移到其他类型对象上作为方法使用。

该方法的 "length" 属性值为 1𝔽

21.1.3.7 Number.prototype.valueOf ( )

  1. 返回 ? ThisNumberValue(this value)。

21.1.3.7.1 ThisNumberValue ( value )

The abstract operation ThisNumberValue takes argument value (an ECMAScript language value) and returns 一个包含 Number 的正常完成或一个 throw completion. It performs the following steps when called:

  1. 如果 value 是 Number,返回 value
  2. 如果 value 是 Objectvalue[[NumberData]] 内部槽,则
    1. nvalue.[[NumberData]]
    2. 断言:n 是 Number
    3. 返回 n
  3. 抛出 TypeError 异常。

21.1.4 Number 实例的属性 (Properties of Number Instances)

Number 实例是继承自 Number 原型对象普通对象。Number 实例还具有 [[NumberData]] 内部槽。[[NumberData]] 内部槽是该 Number 对象所表示的 Number 值。

21.2 BigInt 对象 (BigInt Objects)

21.2.1 BigInt 构造函数 (The BigInt Constructor)

BigInt 构造函数

  • %BigInt%
  • 是全局对象 "BigInt" 属性的初始值。
  • 作为函数而非构造函数调用时执行类型转换。
  • 不打算与 new 运算符一起使用,也不打算被子类化。它可用作类定义 extends 子句的取值,但对 BigInt 构造函数super 调用将导致异常。

21.2.1.1 BigInt ( value )

该函数被调用时执行以下步骤:

  1. 如果 NewTarget 不为 undefined,抛出 TypeError 异常。
  2. prim 为 ? ToPrimitive(value, number)。
  3. 如果 prim 是 Number,返回 ? NumberToBigInt(prim)。
  4. 否则,返回 ? ToBigInt(prim)。

21.2.1.1.1 NumberToBigInt ( number )

The abstract operation NumberToBigInt takes argument number (a Number) and returns 要么是包含一个 BigInt 的正常完成,要么是一个 throw completion. It performs the following steps when called:

  1. 如果 number 不是整数的 Number,抛出 RangeError 异常。
  2. 返回 ((number))。

21.2.2 BigInt 构造函数的属性 (Properties of the BigInt Constructor)

BigInt 构造函数

21.2.2.1 BigInt.asIntN ( bits, bigint )

该函数被调用时执行以下步骤:

  1. bits 设为 ? ToIndex(bits)。
  2. bigint 设为 ? ToBigInt(bigint)。
  3. mod(bigint) 对 2bits 取模的结果。
  4. 如果 mod ≥ 2bits - 1,返回 (mod - 2bits);否则返回 (mod)。

21.2.2.2 BigInt.asUintN ( bits, bigint )

该函数被调用时执行以下步骤:

  1. bits 设为 ? ToIndex(bits)。
  2. bigint 设为 ? ToBigInt(bigint)。
  3. 返回 ((bigint) modulo 2bits)。

21.2.2.3 BigInt.prototype

BigInt.prototype 的初始值是 BigInt 原型对象。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.2.3 BigInt 原型对象的属性 (Properties of the BigInt Prototype Object)

BigInt 原型对象

在一个方法的规范中,短语 “this BigInt value” 指调用抽象操作 ThisBigIntValue 并以该方法调用的 this 值为实参所返回的结果。

21.2.3.1 BigInt.prototype.constructor

BigInt.prototype.constructor 的初始值是 %BigInt%

21.2.3.2 BigInt.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按 ECMA-402 规范实现此方法。如果实现不包含 ECMA-402 API,则使用以下规范:

该方法生成一个表示此 BigInt 值的 String,按照宿主环境当前区域设置的惯例格式化。此方法是实现定义的;允许(但不鼓励)其返回与 toString 相同的结果。

此方法可选参数的意义由 ECMA-402 规范定义;不包含 ECMA-402 支持的实现不得将这些参数位置用于其他用途。

21.2.3.3 BigInt.prototype.toString ( [ radix ] )

Note

可选的 radix 应为区间 2𝔽36𝔽(含)内的整数 Number。如果 radixundefined,则使用 10𝔽 作为基数。

该方法被调用时执行以下步骤:

  1. x 为 ? ThisBigIntValue(this value)。
  2. 如果 radixundefined,令 radixMV 为 10。
  3. 否则,令 radixMV 为 ? ToIntegerOrInfinity(radix)。
  4. 如果 radixMV 不在 2 到 36 的闭区间内,抛出 RangeError 异常。
  5. 返回 BigInt::toString(x, radixMV)。

该方法不是通用的;如果其 this不是 BigInt 或 BigInt 对象则抛出 TypeError 异常。因此它不能被转移到其他类型对象上用作方法。

21.2.3.4 BigInt.prototype.valueOf ( )

  1. 返回 ? ThisBigIntValue(this value)。

21.2.3.4.1 ThisBigIntValue ( value )

The abstract operation ThisBigIntValue takes argument value (an ECMAScript language value) and returns 要么是包含一个 BigInt 的正常完成,要么是一个 throw completion. It performs the following steps when called:

  1. 如果 value 是 BigInt,返回 value
  2. 如果 value 是 Objectvalue[[BigIntData]] 内部槽,则
    1. 断言:value.[[BigIntData]] 是 BigInt
    2. 返回 value.[[BigIntData]]
  3. 抛出 TypeError 异常。

21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是字符串 "BigInt"

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

21.2.4 BigInt 实例的属性 (Properties of BigInt Instances)

BigInt 实例是继承自 BigInt 原型对象普通对象。BigInt 实例还具有 [[BigIntData]] 内部槽。[[BigIntData]] 内部槽是该 BigInt 对象所表示的 BigInt 值

21.3 Math 对象 (The Math Object)

Math 对象:

  • %Math%
  • 是全局对象 "Math" 属性的初始值。
  • 是一个普通对象
  • [[Prototype]] 内部槽,其值为 %Object.prototype%
  • 不是函数对象
  • 没有 [[Construct]] 内部方法;不能与 new 一起作为构造函数使用。
  • 没有 [[Call]] 内部方法;不能作为函数调用。
Note

在本规范中,短语 “the Number value for x” 有在 6.1.6.1 中定义的技术含义。

21.3.1 Math 对象的值属性 (Value Properties of the Math Object)

21.3.1.1 Math.E

自然对数的底 e 的 Number 值,约为 2.7182818284590452354。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.2 Math.LN10

10 的自然对数的 Number 值,约为 2.302585092994046。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.3 Math.LN2

2 的自然对数的 Number 值,约为 0.6931471805599453。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.4 Math.LOG10E

e 的常用对数(以 10 为底)的 Number 值,约为 0.4342944819032518。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Note

Math.LOG10E 的值约等于 Math.LN10 值的倒数。

21.3.1.5 Math.LOG2E

e 的以 2 为底的对数的 Number 值,约为 1.4426950408889634。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Note

Math.LOG2E 的值约等于 Math.LN2 值的倒数。

21.3.1.6 Math.PI

圆周率 π 的 Number 值,即圆的周长与直径之比,约为 3.1415926535897932。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.7 Math.SQRT1_2

1/2 的平方根的 Number 值,约为 0.7071067811865476。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Note

Math.SQRT1_2 的值约等于 Math.SQRT2 值的倒数。

21.3.1.8 Math.SQRT2

2 的平方根的 Number 值,约为 1.4142135623730951。

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.9 Math [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是字符串 "Math"

该属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

21.3.2 Math 对象的函数属性 (Function Properties of the Math Object)

Note

acosacoshasinasinhatanatanhatan2cbrtcoscoshexpexpm1hypotloglog1plog2log10powrandomsinsinhtantanh 这些函数的行为,在此未被精确规定,除要求在某些表示边界情况的参数值上给出特定结果。对于其它参数值,这些函数旨在计算熟知数学函数的近似值,但在近似算法的选择上允许一定自由。总体意图是:实现者应能在某硬件平台上为 ECMAScript 使用与该平台上 C 程序员可用的同一数学库。

虽然算法选择留给实现,但(非标准要求地)推荐实现使用 Sun Microsystems 的可自由发布数学库 fdlibm(适用于 IEEE 754-2019 算术的近似算法)(http://www.netlib.org/fdlibm)。

21.3.2.1 Math.abs ( x )

返回 x 的绝对值;结果与 x 具有相同数值大小且符号为正。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,返回 NaN
  3. 如果 n-0𝔽,返回 +0𝔽
  4. 如果 n-∞𝔽,返回 +∞𝔽
  5. 如果 n < -0𝔽,返回 -n
  6. 返回 n

21.3.2.2 Math.acos ( x )

返回 x 的反余弦。结果用弧度表示,位于 +0𝔽𝔽(π) 的闭区间

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,或 n > 1𝔽,或 n < -1𝔽,返回 NaN
  3. 如果 n1𝔽,返回 +0𝔽
  4. 返回一个实现近似的 Number,表示 (n) 的反余弦。

21.3.2.3 Math.acosh ( x )

返回 x 的反双曲余弦。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,返回 n
  3. 如果 n1𝔽,返回 +0𝔽
  4. 如果 n < 1𝔽,返回 NaN
  5. 返回一个实现近似的 Number,表示 (n) 的反双曲余弦。

21.3.2.4 Math.asin ( x )

返回 x 的反正弦。结果用弧度表示,位于 𝔽(-π / 2) 到 𝔽(π / 2) 的闭区间

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,返回 n
  3. 如果 n > 1𝔽n < -1𝔽,返回 NaN
  4. 返回一个实现近似的 Number,表示 (n) 的反正弦。

21.3.2.5 Math.asinh ( x )

返回 x 的反双曲正弦。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n有限n+0𝔽-0𝔽,返回 n
  3. 返回一个实现近似的 Number,表示 (n) 的反双曲正弦。

21.3.2.6 Math.atan ( x )

返回 x 的反正切。结果用弧度表示,位于 𝔽(-π / 2) 到 𝔽(π / 2) 的闭区间

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,返回 n
  3. 如果 n+∞𝔽,返回一个实现近似的 Number,表示 π / 2。
  4. 如果 n-∞𝔽,返回一个实现近似的 Number,表示 -π / 2。
  5. 返回一个实现近似的 Number,表示 (n) 的反正切。

21.3.2.7 Math.atanh ( x )

返回 x 的反双曲正切。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,返回 n
  3. 如果 n > 1𝔽n < -1𝔽,返回 NaN
  4. 如果 n1𝔽,返回 +∞𝔽
  5. 如果 n-1𝔽,返回 -∞𝔽
  6. 返回一个实现近似的 Number,表示 (n) 的反双曲正切。

21.3.2.8 Math.atan2 ( y, x )

返回参数 yx 的商 y / x 的反正切,yx 的符号用于确定结果所在象限。注意按传统约定,两个参数的反正切函数中名为 y 的参数在前,名为 x 的参数在后。结果用弧度表示,位于 -π 到 +π 的闭区间

被调用时执行以下步骤:

  1. ny 为 ? ToNumber(y)。
  2. nx 为 ? ToNumber(x)。
  3. 如果 nyNaNnxNaN,返回 NaN
  4. 如果 ny+∞𝔽,则
    1. 如果 nx+∞𝔽,返回一个实现近似的 Number,表示 π / 4。
    2. 如果 nx-∞𝔽,返回一个实现近似的 Number,表示 3π / 4。
    3. 返回一个实现近似的 Number,表示 π / 2。
  5. 如果 ny-∞𝔽,则
    1. 如果 nx+∞𝔽,返回一个实现近似的 Number,表示 -π / 4。
    2. 如果 nx-∞𝔽,返回一个实现近似的 Number,表示 -3π / 4。
    3. 返回一个实现近似的 Number,表示 -π / 2。
  6. 如果 ny+0𝔽,则
    1. 如果 nx > +0𝔽nx+0𝔽,返回 +0𝔽
    2. 返回一个实现近似的 Number,表示 π。
  7. 如果 ny-0𝔽,则
    1. 如果 nx > +0𝔽nx+0𝔽,返回 -0𝔽
    2. 返回一个实现近似的 Number,表示 -π。
  8. 断言:ny有限,且既不是 +0𝔽 也不是 -0𝔽
  9. 如果 ny > +0𝔽,则
    1. 如果 nx+∞𝔽,返回 +0𝔽
    2. 如果 nx-∞𝔽,返回一个实现近似的 Number,表示 π。
    3. 如果 nx+0𝔽-0𝔽,返回一个实现近似的 Number,表示 π / 2。
  10. 如果 ny < -0𝔽,则
    1. 如果 nx+∞𝔽,返回 -0𝔽
    2. 如果 nx-∞𝔽,返回一个实现近似的 Number,表示 -π。
    3. 如果 nx+0𝔽-0𝔽,返回一个实现近似的 Number,表示 -π / 2。
  11. 断言:nx有限,且既不是 +0𝔽 也不是 -0𝔽
  12. rabs((ny) / (nx)) 的反正切。
  13. 如果 nx < -0𝔽,则
    1. 如果 ny > +0𝔽,设 r = π - r
    2. 否则,设 r = -π + r
  14. 否则,
    1. 如果 ny < -0𝔽,设 r = -r
  15. 返回一个实现近似的 Number,表示 r

21.3.2.9 Math.cbrt ( x )

返回 x 的立方根。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n有限n+0𝔽-0𝔽,返回 n
  3. 返回一个实现近似的 Number,表示 (n) 的立方根。

21.3.2.10 Math.ceil ( x )

返回不小于 x 的最小(最接近 -∞)整数 Number 值。若 x 已是整数 Number,则结果为 x

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n有限n+0𝔽-0𝔽,返回 n
  3. 如果 n < -0𝔽n > -1𝔽,返回 -0𝔽
  4. 如果 n 是整数的 Number,返回 n
  5. 返回不小于 n 的最小(最接近 -∞)整数 Number。
Note

Math.ceil(x) 的值与 -Math.floor(-x) 的值相同。

21.3.2.11 Math.clz32 ( x )

该函数被调用时执行以下步骤:

  1. n 为 ? ToUint32(x)。
  2. pn 的无符号 32 位二进制表示的前导零位数。
  3. 返回 𝔽(p)。
Note

如果 n+0𝔽-0𝔽,本方法返回 32𝔽。如果 n 的 32 位最高有效位是 1,本方法返回 +0𝔽

21.3.2.12 Math.cos ( x )

返回 x 的余弦。参数用弧度表示。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n有限,返回 NaN
  3. 如果 n+0𝔽-0𝔽,返回 1𝔽
  4. 返回一个实现近似的 Number,表示 (n) 的余弦。

21.3.2.13 Math.cosh ( x )

返回 x 的双曲余弦。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,返回 NaN
  3. 如果 n+∞𝔽-∞𝔽,返回 +∞𝔽
  4. 如果 n+0𝔽-0𝔽,返回 1𝔽
  5. 返回一个实现近似的 Number,表示 (n) 的双曲余弦。
Note

Math.cosh(x) 的值等于 (Math.exp(x) + Math.exp(-x)) / 2

21.3.2.14 Math.exp ( x )

返回指数函数 exe 为自然对数的底)。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,返回 n
  3. 如果 n+0𝔽-0𝔽,返回 1𝔽
  4. 如果 n-∞𝔽,返回 +0𝔽
  5. 返回一个实现近似的 Number,表示 (n) 的指数函数值。

21.3.2.15 Math.expm1 ( x )

返回指数函数 ex 减 1 的结果(e 为自然对数的底)。即使 x 接近 0 也应保持精确。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽、* -0*𝔽+∞𝔽 之一,返回 n
  3. 如果 n-∞𝔽,返回 -1𝔽
  4. exp(n) 的指数函数。
  5. 返回一个实现近似的 Number,表示 exp - 1。

21.3.2.16 Math.floor ( x )

返回不大于 x 的最大(最接近 +∞)整数 Number 值。若 x 已是整数 Number,则结果为 x

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n有限n+0𝔽-0𝔽,返回 n
  3. 如果 n < 1𝔽n > +0𝔽,返回 +0𝔽
  4. 如果 n 是整数的 Number,返回 n
  5. 返回不大于 n 的最大(最接近 +∞)整数 Number。
Note

Math.floor(x) 的值与 -Math.ceil(-x) 的值相同。

21.3.2.17 Math.fround ( x )

该函数被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,返回 NaN
  3. 如果 n+0𝔽、* -0*𝔽+∞𝔽-∞𝔽 之一,返回 n
  4. n32 为将 n 按 roundTiesToEven 模式转换为 IEEE 754-2019 binary32 格式的结果。
  5. n64 为将 n32 转换为 IEEE 754-2019 binary64 格式的结果。
  6. 返回与 n64 对应的 ECMAScript Number 值。

21.3.2.18 Math.f16round ( x )

该函数被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,返回 NaN
  3. 如果 n+0𝔽、* -0*𝔽+∞𝔽-∞𝔽 之一,返回 n
  4. n16 为将 n 按 roundTiesToEven 模式转换为 IEEE 754-2019 binary16 格式的结果。
  5. n64 为将 n16 转换为 IEEE 754-2019 binary64 格式的结果。
  6. 返回与 n64 对应的 ECMAScript Number 值。
Note

此操作不同于先转换为 binary32 再转换为 binary16,因为可能出现双重舍入:例如 k = 1.00048828125000022204𝔽,Math.f16round(k) 为 1.0009765625𝔽,但 Math.f16round(Math.fround(k)) 为 1𝔽

并非所有平台都提供从 binary64 转换到 binary16 的原生支持。有多种库可提供此功能,包括 MIT 许可的 half 库。或者,可以先在 roundTiesToEven 下从 binary64 转换到 binary32,然后检查结果是否可能导致错误的双重舍入。可能导致的情况可以通过调整 binary32 尾数,使其等同于在 roundTiesToOdd 下的初始转换结果来显式处理。随后在 roundTiesToEven 下将调整后的值转换为 binary16 即可得到正确值。

21.3.2.19 Math.hypot ( ...args )

给定零个或多个参数,返回各参数平方和的平方根。

被调用时执行以下步骤:

  1. coerced 为一个新的空列表。
  2. args 中每个元素 arg,执行
    1. n 为 ? ToNumber(arg)。
    2. 追加 ncoerced
  3. coerced 中每个元素 number,执行
    1. 如果 number+∞𝔽-∞𝔽,返回 +∞𝔽
  4. onlyZerotrue
  5. coerced 中每个元素 number,执行
    1. 如果 numberNaN,返回 NaN
    2. 如果 number 既不是 +0𝔽 也不是 -0𝔽,设 onlyZerofalse
  6. 如果 onlyZerotrue,返回 +0𝔽
  7. 返回一个实现近似的 Number,表示 coerced 各元素数学值平方和的平方根。

此函数的 "length" 属性值为 2𝔽

Note

实现应注意避免在具有两个或更多参数时出现朴素实现易触发的溢出与下溢导致的精度丢失。

21.3.2.20 Math.imul ( x, y )

该函数被调用时执行以下步骤:

  1. a(? ToUint32(x))。
  2. b(? ToUint32(y))。
  3. product 为 (a × b) 对 232 取模的结果。
  4. 如果 product ≥ 231,返回 𝔽(product - 232);否则返回 𝔽(product)。

21.3.2.21 Math.log ( x )

返回 x 的自然对数。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,返回 n
  3. 如果 n1𝔽,返回 +0𝔽
  4. 如果 n+0𝔽-0𝔽,返回 -∞𝔽
  5. 如果 n < -0𝔽,返回 NaN
  6. 返回一个实现近似的 Number,表示 (n) 的自然对数。

21.3.2.22 Math.log1p ( x )

返回 1 + x 的自然对数;即使 x 接近 0 也要求精确。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽、* -0*𝔽+∞𝔽 之一,返回 n
  3. 如果 n-1𝔽,返回 -∞𝔽
  4. 如果 n < -1𝔽,返回 NaN
  5. 返回一个实现近似的 Number,表示 1 + (n) 的自然对数。

21.3.2.23 Math.log10 ( x )

返回 x 的以 10 为底的对数。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,返回 n
  3. 如果 n1𝔽,返回 +0𝔽
  4. 如果 n+0𝔽-0𝔽,返回 -∞𝔽
  5. 如果 n < -0𝔽,返回 NaN
  6. 返回一个实现近似的 Number,表示 (n) 的以 10 为底的对数。

21.3.2.24 Math.log2 ( x )

返回 x 的以 2 为底的对数。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,返回 n
  3. 如果 n1𝔽,返回 +0𝔽
  4. 如果 n+0𝔽-0𝔽,返回 -∞𝔽
  5. 如果 n < -0𝔽,返回 NaN
  6. 返回一个实现近似的 Number,表示 (n) 的以 2 为底的对数。

21.3.2.25 Math.max ( ...args )

给定零个或多个参数,对每个参数执行 ToNumber,并返回结果值中的最大值。

被调用时执行以下步骤:

  1. coerced 为一个新的空列表。
  2. args 中每个元素 arg,执行
    1. n 为 ? ToNumber(arg)。
    2. 追加 ncoerced
  3. highest-∞𝔽
  4. coerced 中每个元素 number,执行
    1. 如果 numberNaN,返回 NaN
    2. 如果 number+0𝔽highest-0𝔽,设 highest+0𝔽
    3. 如果 number > highest,设 highestnumber
  5. 返回 highest
Note

确定最大值的比较使用 IsLessThan 算法,但 +0𝔽 被认为大于 -0𝔽

此函数的 "length" 属性值为 2𝔽

21.3.2.26 Math.min ( ...args )

给定零个或多个参数,对每个参数执行 ToNumber,并返回结果值中的最小值。

被调用时执行以下步骤:

  1. coerced 为一个新的空列表。
  2. args 中每个元素 arg,执行
    1. n 为 ? ToNumber(arg)。
    2. 追加 ncoerced
  3. lowest+∞𝔽
  4. coerced 中每个元素 number,执行
    1. 如果 numberNaN,返回 NaN
    2. 如果 number-0𝔽lowest+0𝔽,设 lowest-0𝔽
    3. 如果 number < lowest,设 lowestnumber
  5. 返回 lowest
Note

确定最大值的比较使用 IsLessThan 算法,但 +0𝔽 被认为大于 -0𝔽

此函数的 "length" 属性值为 2𝔽

21.3.2.27 Math.pow ( base, exponent )

该函数被调用时执行以下步骤:

  1. base 设为 ? ToNumber(base)。
  2. exponent 设为 ? ToNumber(exponent)。
  3. 返回 Number::exponentiate(base, exponent)。

21.3.2.28 Math.random ( )

返回一个具有正号的 Number,值 ≥ +0𝔽 且 < 1𝔽,在该范围内以近似均匀分布随机或伪随机选择,使用实现定义的算法或策略。

为不同 realm 创建的每个 Math.random 函数必须产生与其它 realm 不同的值序列。

21.3.2.29 Math.round ( x )

返回最接近 x 的整数 Number 值;若有两个整数同样接近 x,结果为更靠近 +∞ 的那个。若 x 已是整数,则结果为 x

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n有限n 是整数 Number,返回 n
  3. 如果 n < 0.5𝔽n > +0𝔽,返回 +0𝔽
  4. 如果 n < -0𝔽n-0.5𝔽,返回 -0𝔽
  5. 返回最接近 n 的整数 Number;若存在平局,取更靠近 +∞ 的那个。
Note 1

Math.round(3.5) 返回 4,而 Math.round(-3.5) 返回 -3。

Note 2

Math.round(x) 的值不总是等于 Math.floor(x + 0.5)。当 x-0𝔽x < -0𝔽 且 ≥ -0.5𝔽 时,Math.round(x) 返回 -0𝔽,但 Math.floor(x + 0.5) 返回 +0𝔽。计算 x + 0.5 时的内部舍入也可能使结果不同。

21.3.2.30 Math.sign ( x )

返回 x 的符号,指示 x 是正、负或零。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,返回 n
  3. 如果 n < -0𝔽,返回 -1𝔽
  4. 返回 1𝔽

21.3.2.31 Math.sin ( x )

返回 x 的正弦。参数用弧度表示。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,返回 n
  3. 如果 n+∞𝔽-∞𝔽,返回 NaN
  4. 返回一个实现近似的 Number,表示 (n) 的正弦。

21.3.2.32 Math.sinh ( x )

返回 x 的双曲正弦。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n有限n+0𝔽-0𝔽,返回 n
  3. 返回一个实现近似的 Number,表示 (n) 的双曲正弦。
Note

Math.sinh(x) 的值等于 (Math.exp(x) - Math.exp(-x)) / 2

21.3.2.33 Math.sqrt ( x )

返回 x 的平方根。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽、* -0*𝔽+∞𝔽 之一,返回 n
  3. 如果 n < -0𝔽,返回 NaN
  4. 返回 𝔽((n) 的平方根)。

21.3.2.34 Math.sumPrecise ( items )

给定一个由 Number 组成的可迭代对象,对其中每个值求和并返回和。如果任一值不是 Number 则抛出 TypeError 异常。

被调用时执行以下步骤:

  1. 执行 ? RequireObjectCoercible(items)。
  2. iteratorRecord 为 ? GetIterator(items, sync)。
  3. stateminus-zero
  4. sum 为 0。
  5. count 为 0。
  6. nextnot-started
  7. next 不为 done 时重复,
    1. next 为 ? IteratorStepValue(iteratorRecord)。
    2. 如果 next 不为 done,则
      1. 如果 count ≥ 253 - 1,则
        1. 注:理论上不期望到达此步骤,仅用于允许实现依赖“合理大小”的输入而不违背规范。
        2. errorThrowCompletion(一个新建的 RangeError 对象)。
        3. 返回 ? IteratorClose(iteratorRecord, error)。
      2. 如果 next 不是 Number,则
        1. errorThrowCompletion(一个新建的 TypeError 对象)。
        2. 返回 ? IteratorClose(iteratorRecord, error)。
      3. nnext
      4. 如果 state 不为 not-a-number,则
        1. 如果 nNaN,则
          1. statenot-a-number
        2. 否则如果 n+∞𝔽,则
          1. 如果 stateminus-infinity,设 statenot-a-number
          2. 否则设 stateplus-infinity
        3. 否则如果 n-∞𝔽,则
          1. 如果 stateplus-infinity,设 statenot-a-number
          2. 否则设 stateminus-infinity
        4. 否则如果 n 不是 -0𝔽stateminus-zerofinite,则
          1. statefinite
          2. sumsum + (n)。
      5. countcount + 1。
  8. 如果 statenot-a-number,返回 NaN
  9. 如果 stateplus-infinity,返回 +∞𝔽
  10. 如果 stateminus-infinity,返回 -∞𝔽
  11. 如果 stateminus-zero,返回 -0𝔽
  12. 返回 𝔽(sum)。
Note

sum 的值可通过多种算法在无需任意精度算术的情况下计算。其中之一是 Jonathan Richard Shewchuk 在《Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates》中给出的 “Grow-Expansion” 算法。一个更新的算法见 “Fast exact summation using small and large superaccumulators”,其代码位于 https://gitlab.com/radfordneal/xsum

21.3.2.35 Math.tan ( x )

返回 x 的正切。参数用弧度表示。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,返回 n
  3. 如果 n+∞𝔽-∞𝔽,返回 NaN
  4. 返回一个实现近似的 Number,表示 (n) 的正切。

21.3.2.36 Math.tanh ( x )

返回 x 的双曲正切。

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,返回 n
  3. 如果 n+∞𝔽,返回 1𝔽
  4. 如果 n-∞𝔽,返回 -1𝔽
  5. 返回一个实现近似的 Number,表示 (n) 的双曲正切。
Note

Math.tanh(x) 的值等于 (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))

21.3.2.37 Math.trunc ( x )

返回数字 x 的整数部分,去除任何小数部分。若 x 已是整数,结果为 x

被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n有限n+0𝔽-0𝔽,返回 n
  3. 如果 n < 1𝔽n > +0𝔽,返回 +0𝔽
  4. 如果 n < -0𝔽n > -1𝔽,返回 -0𝔽
  5. 返回朝向 +0𝔽 方向最接近 n 的整数 Number。

21.4 Date 对象

21.4.1 Date 对象概述及抽象操作定义

以下抽象操作作用于时间值(定义见 21.4.1.1)。注意,在所有情况下,如果这些函数的任何参数为 NaN,则结果为 NaN

21.4.1.1 时间值与时间范围

ECMAScript 的时间度量与 POSIX 的时间度量类似,特别是在使用前推的公历、以 1970 年 1 月 1 日 UTC 零点为 纪元,以及每一天精确包含 86,400 秒(每秒为 1000 毫秒)的定义上。

ECMAScript 的 时间值 是一个 Number,要么是表示某一时刻的有限整数 Number(精确到毫秒),要么是 NaN 表示没有具体时刻。一个是 24 × 60 × 60 × 1000 = 86,400,000 的倍数(即对于某个整数 d,为 86,400,000 × d)的时间值,表示自纪元起经过 d 个完整 UTC 日的 UTC 日起始时刻(负 d 表示纪元之前)。其他有限时间值 t 则以紧邻其之前最大倍数的时间值 s 为基准,表示与 s 同一天内,距离 s 之后 (t - s) 毫秒的时刻。

时间值不考虑 UTC 闰秒——没有表示正闰秒内时刻的时间值,也有表示因负闰秒从 UTC 时间线移除的时刻的时间值。但时间值的定义仍然与 UTC 分段对齐,只有在闰秒边界处有不连续,非闰秒时为零差异。

Number 能精确表示从 -9,007,199,254,740,992 到 9,007,199,254,740,992 的所有整数(见 21.1.2.821.1.2.6)。而时间值支持稍小的范围 -8,640,000,000,000,000 到 8,640,000,000,000,000 毫秒。这对应于自 1970 年 1 月 1 日 UTC 零点起精确的 -100,000,000 天到 100,000,000 天的时间值范围。

1970 年 1 月 1 日 UTC 零点的精确时刻由时间值 +0𝔽 表示。

Note

在前推的公历中,闰年是能被 4 整除且(能被 400 整除或不能被 100 整除)的年份。

前推的公历 400 年周期包含 97 个闰年,平均每年为 365.2425 天,即 31,556,952,000 毫秒。因此用毫秒精度 Number 可精确表示的最大范围约为距 1970 年前后 -285,426 到 285,426 年。按本节时间值的更小支持范围约为距 1970 年前后 -273,790 到 273,790 年。

21.4.1.2 时间相关常量

这些常量会被后续章节中的算法引用。

HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000𝔽
msPerMinute = 60000𝔽 = msPerSecond × 𝔽(SecondsPerMinute)
msPerHour = 3600000𝔽 = msPerMinute × 𝔽(MinutesPerHour)
msPerDay = 86400000𝔽 = msPerHour × 𝔽(HoursPerDay)

21.4.1.3 Day ( t )

The abstract operation Day takes argument t (有限时间值) and returns 整数 Number. It performs the following steps when called:

  1. 返回 𝔽(floor((t / msPerDay)))。

21.4.1.4 TimeWithinDay ( t )

The abstract operation TimeWithinDay takes argument t (有限时间值) and returns 区间 +0𝔽(含)至 msPerDay(不含)内的整数 Number. It performs the following steps when called:

  1. 返回 𝔽((t) 模 (msPerDay))。

21.4.1.5 DaysInYear ( y )

The abstract operation DaysInYear takes argument y (整数 Number) and returns 365𝔽366𝔽. It performs the following steps when called:

  1. ry(y)。
  2. 若 (ry 模 400) = 0,返回 366𝔽
  3. 若 (ry 模 100) = 0,返回 365𝔽
  4. 若 (ry 模 4) = 0,返回 366𝔽
  5. 返回 365𝔽

21.4.1.6 DayFromYear ( y )

The abstract operation DayFromYear takes argument y (整数 Number) and returns 整数 Number. It performs the following steps when called:

  1. ry(y)。
  2. 注:下列步骤中,numYears1numYears4numYears100numYears400 表示自纪元y 年首之间能被 1、4、100、400 整除的年份数。若 y纪元之前则为负数。
  3. numYears1 为 (ry - 1970)。
  4. numYears4floor((ry - 1969) / 4)。
  5. numYears100floor((ry - 1901) / 100)。
  6. numYears400floor((ry - 1601) / 400)。
  7. 返回 𝔽(365 × numYears1 + numYears4 - numYears100 + numYears400)。

21.4.1.7 TimeFromYear ( y )

The abstract operation TimeFromYear takes argument y (整数 Number) and returns 时间值. It performs the following steps when called:

  1. 返回 msPerDay × DayFromYear(y)。

21.4.1.8 YearFromTime ( t )

The abstract operation YearFromTime takes argument t (有限时间值) and returns 整数 Number. It performs the following steps when called:

  1. 返回满足 TimeFromYear(y) ≤ t 的最大整数 Number y(最接近 +∞)。

21.4.1.9 DayWithinYear ( t )

The abstract operation DayWithinYear takes argument t (有限时间值) and returns 区间 +0𝔽365𝔽(含)的整数 Number. It performs the following steps when called:

  1. 返回 Day(t) - DayFromYear(YearFromTime(t))。

21.4.1.10 InLeapYear ( t )

The abstract operation InLeapYear takes argument t (有限时间值) and returns +0𝔽1𝔽. It performs the following steps when called:

  1. DaysInYear(YearFromTime(t)) 为 366𝔽,则返回 1𝔽;否则返回 +0𝔽

21.4.1.11 MonthFromTime ( t )

The abstract operation MonthFromTime takes argument t (有限时间值) and returns 区间 +0𝔽11𝔽(含)的整数 Number. It performs the following steps when called:

  1. inLeapYearInLeapYear(t)。
  2. dayWithinYearDayWithinYear(t)。
  3. dayWithinYear < 31𝔽,返回 +0𝔽
  4. dayWithinYear < 59𝔽 + inLeapYear,返回 1𝔽
  5. dayWithinYear < 90𝔽 + inLeapYear,返回 2𝔽
  6. dayWithinYear < 120𝔽 + inLeapYear,返回 3𝔽
  7. dayWithinYear < 151𝔽 + inLeapYear,返回 4𝔽
  8. dayWithinYear < 181𝔽 + inLeapYear,返回 5𝔽
  9. dayWithinYear < 212𝔽 + inLeapYear,返回 6𝔽
  10. dayWithinYear < 243𝔽 + inLeapYear,返回 7𝔽
  11. dayWithinYear < 273𝔽 + inLeapYear,返回 8𝔽
  12. dayWithinYear < 304𝔽 + inLeapYear,返回 9𝔽
  13. dayWithinYear < 334𝔽 + inLeapYear,返回 10𝔽
  14. 断言:dayWithinYear < 365𝔽 + inLeapYear
  15. 返回 11𝔽

21.4.1.12 DateFromTime ( t )

The abstract operation DateFromTime takes argument t (有限时间值) and returns 区间 1𝔽31𝔽(含)的整数 Number. It performs the following steps when called:

  1. inLeapYearInLeapYear(t)。
  2. dayWithinYearDayWithinYear(t)。
  3. monthMonthFromTime(t)。
  4. month+0𝔽,返回 dayWithinYear + 1𝔽
  5. month1𝔽,返回 dayWithinYear - 30𝔽
  6. month2𝔽,返回 dayWithinYear - 58𝔽 - inLeapYear
  7. month3𝔽,返回 dayWithinYear - 89𝔽 - inLeapYear
  8. month4𝔽,返回 dayWithinYear - 119𝔽 - inLeapYear
  9. month5𝔽,返回 dayWithinYear - 150𝔽 - inLeapYear
  10. month6𝔽,返回 dayWithinYear - 180𝔽 - inLeapYear
  11. month7𝔽,返回 dayWithinYear - 211𝔽 - inLeapYear
  12. month8𝔽,返回 dayWithinYear - 242𝔽 - inLeapYear
  13. month9𝔽,返回 dayWithinYear - 272𝔽 - inLeapYear
  14. month10𝔽,返回 dayWithinYear - 303𝔽 - inLeapYear
  15. 断言:month11𝔽
  16. 返回 dayWithinYear - 333𝔽 - inLeapYear

21.4.1.13 WeekDay ( t )

The abstract operation WeekDay takes argument t (有限时间值) and returns 区间 +0𝔽6𝔽(含)的整数 Number. It performs the following steps when called:

  1. 返回 𝔽((Day(t) + 4𝔽) 模 7)。

21.4.1.14 HourFromTime ( t )

The abstract operation HourFromTime takes argument t (有限时间值) and returns 区间 +0𝔽23𝔽(含)的整数 Number. It performs the following steps when called:

  1. 返回 𝔽(floor((t / msPerHour)) 模 HoursPerDay)。

21.4.1.15 MinFromTime ( t )

The abstract operation MinFromTime takes argument t (有限时间值) and returns 区间 +0𝔽59𝔽(含)的整数 Number. It performs the following steps when called:

  1. 返回 𝔽(floor((t / msPerMinute)) 模 MinutesPerHour)。

21.4.1.16 SecFromTime ( t )

The abstract operation SecFromTime takes argument t (有限时间值) and returns 区间 +0𝔽59𝔽(含)的整数 Number. It performs the following steps when called:

  1. 返回 𝔽(floor((t / msPerSecond)) 模 SecondsPerMinute)。

21.4.1.17 msFromTime ( t )

The abstract operation msFromTime takes argument t (有限时间值) and returns 区间 +0𝔽999𝔽(含)的整数 Number. It performs the following steps when called:

  1. 返回 𝔽((t) 模 (msPerSecond))。

21.4.1.18 GetUTCEpochNanoseconds ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

The abstract operation GetUTCEpochNanoseconds takes arguments year (整数), month (区间 1 到 12 内的整数), day (区间 1 到 31 内的整数), hour (区间 0 到 23 内的整数), minute (区间 0 到 59 内的整数), second (区间 0 到 59 内的整数), millisecond (区间 0 到 999 内的整数), microsecond (区间 0 到 999 内的整数), and nanosecond (区间 0 到 999 内的整数) and returns BigInt. It performs the following steps when called:

  1. dateMakeDay(𝔽(year), 𝔽(month - 1), 𝔽(day))。
  2. timeMakeTime(𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond))。
  3. msMakeDate(date, time)。
  4. 断言:ms 是整数 Number。
  5. 返回 ((ms) × 106 + microsecond × 103 + nanosecond)。

21.4.1.19 时区标识符

ECMAScript 中的时区由 时区标识符 表示,是完全由码元在 0x0000 到 0x007F 区间组成的字符串。 ECMAScript 支持的时区可以是 可用命名时区,其由 AvailableNamedTimeZoneIdentifiers 返回的时区标识符记录[[Identifier]] 字段表示,或是 偏移时区,其由 IsTimeZoneOffsetString 返回 true 的字符串表示。

主时区标识符是可用命名时区的首选标识符。 非主时区标识符是可用命名时区的非主标识符。 可用命名时区标识符是主时区标识符或非主时区标识符中的一种。 每个可用命名时区标识符只关联一个可用命名时区。 每个可用命名时区只关联一个主时区标识符和零个或多个非主时区标识符。

ECMAScript 实现必须支持标识符为 "UTC" 的可用命名时区,并且该标识符必须是 UTC 时区的主时区标识符。 此外,实现可以支持任意数量的其他可用命名时区。

遵循 ECMA-402 国际化 API 规范描述的时区要求的实现称为 具备时区感知。 具备时区感知的实现必须支持与 IANA 时区数据库的 Zone 和 Link 名称相对应的可用命名时区,并且仅支持这些名称。 在具备时区感知的实现中,主时区标识符是 Zone 名称,非主时区标识符是 Link 名称(除非被 ECMA-402 规范中的 AvailableNamedTimeZoneIdentifiers 特别覆盖)。 不支持完整 IANA 时区数据库的实现仍建议使用 IANA 时区数据库名称作为时区标识符。

21.4.1.20 GetNamedTimeZoneEpochNanoseconds ( timeZoneIdentifier, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

The implementation-defined abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments timeZoneIdentifier (字符串), year (整数), month (区间 1 到 12 内的整数), day (区间 1 到 31 内的整数), hour (区间 0 到 23 内的整数), minute (区间 0 到 59 内的整数), second (区间 0 到 59 内的整数), millisecond (区间 0 到 999 内的整数), microsecond (区间 0 到 999 内的整数), and nanosecond (区间 0 到 999 内的整数) and returns BigInt 列表.

当输入表示由于负时区变更(如夏令时结束或时区规则调整导致偏移减少)而某本地时间出现多次时,返回的列表会有多个元素,并按数值升序排序。 当输入表示由于正时区变更(如夏令时开始或时区规则调整导致偏移增加)而某本地时间被跳过时,返回的列表为空。 否则返回的列表只有一个元素。

未包含任何时区本地规则的 ECMAScript 实现的默认实现步骤如下:

  1. 断言:timeZoneIdentifier"UTC"
  2. epochNanosecondsGetUTCEpochNanoseconds(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)。
  3. 返回 « epochNanoseconds »。
Note

时区感知实现(也推荐所有实现)需使用 IANA 时区数据库 https://www.iana.org/time-zones/ 的时区信息。

2017 年 11 月 5 日 1:30 AM 在 America/New_York 出现两次,因此 GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 11, 5, 1, 30, 0, 0, 0, 0) 会返回一个长度为 2 的列表,第一项表示 05:30 UTC(对应美国东部夏令时 UTC-04:00),第二项表示 06:30 UTC(对应美国东部标准时 UTC-05:00)。

2017 年 3 月 12 日 2:30 AM 在 America/New_York 不存在,因此 GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 3, 12, 2, 30, 0, 0, 0, 0) 会返回空列表。

21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier, epochNanoseconds )

The implementation-defined abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments timeZoneIdentifier (字符串) and epochNanoseconds (BigInt) and returns 整数.

返回的整数表示由 timeZoneIdentifier 标识的命名时区,在与 epochNanoseconds 相对应的时刻相对纪元的 UTC 偏移(单位为纳秒)。

未包含任何时区本地规则的 ECMAScript 实现的默认实现步骤如下:

  1. 断言:timeZoneIdentifier"UTC"
  2. 返回 0。
Note

时区偏移值可能为正或负。

21.4.1.22 时区标识符记录

时区标识符记录是用于描述可用命名时区标识符及其对应主时区标识符的记录。

时区标识符记录具有 Table 62 中列出的字段。

Table 62: 时区标识符记录字段
字段名 含义
[[Identifier]] 字符串 实现支持的可用命名时区标识符
[[PrimaryIdentifier]] 字符串 [[Identifier]] 解析到的主时区标识符
Note

[[Identifier]]主时区标识符,则 [[Identifier]][[PrimaryIdentifier]]

21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )

The implementation-defined abstract operation AvailableNamedTimeZoneIdentifiers takes no arguments and returns 时区标识符记录列表.

具备时区感知的实现(包括所有实现 ECMA-402 国际化 API 的实现)必须按 ECMA-402 规范实现 AvailableNamedTimeZoneIdentifiers 抽象操作。 对于不具备时区感知的实现,AvailableNamedTimeZoneIdentifiers 的默认步骤如下:

  1. 如果实现未包含任何时区本地规则,
    1. 返回 « 时区标识符记录 { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } »。
  2. identifiers 为唯一可用命名时区标识符列表,按字典码元顺序排序。
  3. result 为新空列表。
  4. 对每个 identifier 元素,
    1. primaryidentifier
    2. 如果 identifier 是此实现的非主时区标识符且不是 "UTC"
      1. primary 设为与 identifier 关联的主时区标识符
      2. 注:实现可能需迭代解析 identifier 以获得主时区标识符
    3. record时区标识符记录 { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary }。
    4. record 添加到 result
  5. 断言:result 包含时区标识符记录 r,使得 r.[[Identifier]]"UTC"r.[[PrimaryIdentifier]]"UTC"
  6. 返回 result

21.4.1.24 SystemTimeZoneIdentifier ( )

The implementation-defined abstract operation SystemTimeZoneIdentifier takes no arguments and returns 字符串. It performs the following steps when called:

  1. 如果实现仅支持 UTC 时区,返回 "UTC"
  2. systemTimeZoneString 为代表宿主环境当前时区的字符串(主时区标识符偏移时区标识符)。
  3. 返回 systemTimeZoneString
Note

为确保实现常见 Date 对象方法的功能,建议 SystemTimeZoneIdentifier 返回宿主环境时区设置对应的 IANA 时区名(如存在)。 GetNamedTimeZoneEpochNanosecondsGetNamedTimeZoneOffsetNanoseconds 必须反映该时区标准时间和夏令时的本地政治规则(如有)。

例如,若宿主环境为设置为美国东部时间的浏览器,则 SystemTimeZoneIdentifier 返回 "America/New_York"

21.4.1.25 LocalTime ( t )

The abstract operation LocalTime takes argument t (有限时间值) and returns 整数 Number. It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier()。
  2. 如果 IsTimeZoneOffsetString(systemTimeZoneIdentifier) 为 true
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)。
  3. 否则,
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((t) × 106))。
  4. offsetMstruncate(offsetNs / 106)。
  5. 返回 t + 𝔽(offsetMs)。
Note 1

若实现无法获得本地时间 t 的政治规则,则结果为 t,因为 SystemTimeZoneIdentifier 返回 "UTC"GetNamedTimeZoneOffsetNanoseconds 返回 0。

Note 2

时区感知实现(也推荐所有实现)需使用 IANA 时区数据库 https://www.iana.org/time-zones/ 的时区信息。

Note 3

在负时区变更(如夏令时结束或时区调整减小时)发生重复时间时,两个不同输入时间值 tUTC 会被转换为同一本地时间 tlocalLocalTime(UTC(tlocal)) 不一定等于 tlocal,同理 UTC(LocalTime(tUTC)) 也不一定等于 tUTC

21.4.1.26 UTC ( t )

The abstract operation UTC takes argument t (Number) and returns 时间值. It performs the following steps when called:

  1. t有限,返回 NaN
  2. systemTimeZoneIdentifierSystemTimeZoneIdentifier()。
  3. 如果 IsTimeZoneOffsetString(systemTimeZoneIdentifier) 为 true
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)。
  4. 否则,
    1. possibleInstantsGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(t)), (MonthFromTime(t)) + 1, (DateFromTime(t)), (HourFromTime(t)), (MinFromTime(t)), (SecFromTime(t)), (msFromTime(t)), 0, 0)。
    2. 注:下列步骤确保 t 表示在负时区变更(如夏令时结束或时区调整减小时)中重复出现的本地时间或在正时区变更(如夏令时开始或时区调整增大时)中被跳过的本地时间时,t 按变更前的时区偏移解读。
    3. possibleInstants 非空,
      1. disambiguatedInstantpossibleInstants[0]。
    4. 否则,
      1. 注:t 表示在正时区变更时被跳过的本地时间(如夏令时开始或时区调整增大)。
      2. possibleInstantsBeforeGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(tBefore)), (MonthFromTime(tBefore)) + 1, (DateFromTime(tBefore)), (HourFromTime(tBefore)), (MinFromTime(tBefore)), (SecFromTime(tBefore)), (msFromTime(tBefore)), 0, 0),其中 tBefore 为小于 t 的最大整数 Number,且 possibleInstantsBefore 非空(即 tBefore 为变更前的最后本地时间)。
      3. disambiguatedInstantpossibleInstantsBefore 的最后一项。
    5. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, disambiguatedInstant)。
  5. offsetMstruncate(offsetNs / 106)。
  6. 返回 t - 𝔽(offsetMs)。

输入 t 名义上为时间值,但可为任意 Number。 算法不得限制 t时间值范围,使得无论本地 UTC 偏移如何,都可支持对应时间值范围边界的输入。 例如,最大时间值为 8.64 × 1015,对应 "+275760-09-13T00:00:00Z"。 若本地时区偏移在该时刻为 UTC+1 小时,则对应更大的输入 8.64 × 1015 + 3.6 × 106,即 "+275760-09-13T01:00:00+01:00"

若实现无法获得本地时间 t 的政治规则,则结果为 t,因为 SystemTimeZoneIdentifier 返回 "UTC"GetNamedTimeZoneOffsetNanoseconds 返回 0。

Note 1

时区感知实现(也推荐所有实现)需使用 IANA 时区数据库 https://www.iana.org/time-zones/ 的时区信息。

2017 年 11 月 5 日 1:30 AM 在 America/New_York 出现两次(回拨),但应按 UTC-04 而不是 UTC-05 解释。 在 UTC(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0)))) 中,offsetMs 的值为 -4 × msPerHour

2017 年 3 月 12 日 2:30 AM 在 America/New_York 不存在,但应按 UTC-05(等价于 UTC-04 的 3:30 AM)解释。 在 UTC(TimeClip(MakeDate(MakeDay(2017, 2, 12), MakeTime(2, 30, 0, 0)))) 中,offsetMs 的值为 -5 × msPerHour

Note 2

UTC(LocalTime(tUTC)) 不一定等于 tUTC,同理 LocalTime(UTC(tlocal)) 也不一定等于 tlocal

21.4.1.27 MakeTime ( hour, min, sec, ms )

The abstract operation MakeTime takes arguments hour (Number), min (Number), sec (Number), and ms (Number) and returns Number. It performs the following steps when called:

  1. hourminsecms 任一非有限,返回 NaN
  2. h𝔽(! ToIntegerOrInfinity(hour))。
  3. m𝔽(! ToIntegerOrInfinity(min))。
  4. s𝔽(! ToIntegerOrInfinity(sec))。
  5. milli𝔽(! ToIntegerOrInfinity(ms))。
  6. 返回 ((h × msPerHour + m × msPerMinute) + s × msPerSecond) + milli
Note

MakeTime 的算术为浮点运算,非结合律,须按正确顺序执行。

21.4.1.28 MakeDay ( year, month, date )

The abstract operation MakeDay takes arguments year (Number), month (Number), and date (Number) and returns Number. It performs the following steps when called:

  1. yearmonthdate 任一非有限,返回 NaN
  2. y𝔽(! ToIntegerOrInfinity(year))。
  3. m𝔽(! ToIntegerOrInfinity(month))。
  4. dt𝔽(! ToIntegerOrInfinity(date))。
  5. ymy + 𝔽(floor((m) / 12))。
  6. ym有限,返回 NaN
  7. mn𝔽((m) 模 12)。
  8. 找到 YearFromTime(t) 为 ymMonthFromTime(t) 为 mnDateFromTime(t) 为 1𝔽有限时间值 t;若不可行(如参数越界),返回 NaN
  9. 返回 Day(t) + dt - 1𝔽

21.4.1.29 MakeDate ( day, time )

The abstract operation MakeDate takes arguments day (Number) and time (Number) and returns Number. It performs the following steps when called:

  1. daytime有限,返回 NaN
  2. tvday × msPerDay + time
  3. tv有限,返回 NaN
  4. 返回 tv

21.4.1.30 MakeFullYear ( year )

The abstract operation MakeFullYear takes argument year (Number) and returns 整数 Number 或 NaN. It performs the following steps when called:

  1. yearNaN,返回 NaN
  2. truncated 为 ! ToIntegerOrInfinity(year)。
  3. truncated 在 0 到 99 区间,返回 1900𝔽 + 𝔽(truncated)。
  4. 返回 𝔽(truncated)。

21.4.1.31 TimeClip ( time )

The abstract operation TimeClip takes argument time (Number) and returns Number. It performs the following steps when called:

  1. time有限,返回 NaN
  2. abs((time)) > 8.64 × 1015,返回 NaN
  3. 返回 𝔽(! ToIntegerOrInfinity(time))。

21.4.1.32 日期时间字符串格式

ECMAScript 定义了一种基于 ISO 8601 日历日期扩展格式的日期时间字符串交换格式。格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

各元素说明如下:

YYYY 公历年份,四位十进制数字,范围 0000 到 9999,或 扩展年份,即 "+""-" 加六位数字。
- "-"(连字符)在字符串中出现两次。
MM 月份,两位十进制数字,01(1月)到 12(12月)。
DD 日期,两位十进制数字,01 到 31。
T "T" 字面出现,表示时间部分开始。
HH 自零点起经过的完整小时数,两位十进制数字,00 到 24。
: ":"(冒号)在字符串中出现两次。
mm 小时开始起经过的完整分钟数,两位十进制数字,00 到 59。
ss 分钟开始起经过的完整秒数,两位十进制数字,00 到 59。
. "."(点)字面出现。
sss 秒开始起经过的完整毫秒数,三位十进制数字。
Z UTC 偏移表示,"Z"(无偏移的 UTC),或 "+""-" 加时间表达式 HH:mm(用于表示本地时间领先或落后 UTC,属于 时区偏移字符串格式 的子集)。

该格式还包括仅日期形式:

YYYY
YYYY-MM
YYYY-MM-DD
        

也包括“日期-时间”形式,即上述日期形式紧接以下时间形式之一并可选加偏移:

THH:mm
THH:mm:ss
THH:mm:ss.sss
        

包含越界或不符合规范元素的字符串不是本格式的有效实例。

Note 1

由于每一天既有开始也有结束的零点,00:0024:00 两种记法都可用于区分同一天的两个零点。比如 1995-02-04T24:001995-02-05T00:00 表示同一时刻。这种将后者解释为“日终”与 ISO 8601 一致,尽管该规范仅用于时间区间,不用于单一时刻。

Note 2

国际上不存在民用时区缩写(如 CET、EST 等)的标准,有时同一缩写可表示不同时区。因此,ISO 8601 及本格式均采用数字型偏移表示时区。

21.4.1.32.1 扩展年份

覆盖约 273,790 年前后(自 1970 年 1 月 1 日起,见 21.4.1.1)的完整时间值范围需表示 0 年之前或 9999 年之后的年份。ISO 8601 允许年份扩展,但仅限信息交换双方协商采用。简化的 ECMAScript 格式规定扩展年份为 6 位数字,前缀为 + 或 -。年份 0 视为正数,必须加 + 前缀。-000000 形式无效。超出时间值范围的扩展年份字符串被 Date.parse 视为不可识别,返回 NaN,不会退回实现特定行为或启发式处理。

Note

扩展年份示例:

-271821-04-20T00:00:00Z 公元前 271822 年
-000001-01-01T00:00:00Z 公元前 2 年
+000000-01-01T00:00:00Z 公元前 1 年
+000001-01-01T00:00:00Z 公元 1 年
+001970-01-01T00:00:00Z 公元 1970 年
+002009-12-15T00:00:00Z 公元 2009 年
+275760-09-13T00:00:00Z 公元 275760 年

21.4.1.33 时区偏移字符串格式

ECMAScript 定义了用于 UTC 偏移的字符串交换格式,源自 ISO 8601。 格式描述如下语法。

语法

UTCOffset ::: ASCIISign Hour ASCIISign Hour HourSubcomponents[+Extended] ASCIISign Hour HourSubcomponents[~Extended] ASCIISign ::: one of + - Hour ::: 0 DecimalDigit 1 DecimalDigit 20 21 22 23 HourSubcomponents[Extended] ::: TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

21.4.1.33.1 IsTimeZoneOffsetString ( offsetString )

The abstract operation IsTimeZoneOffsetString takes argument offsetString (字符串) and returns 布尔值. It performs the following steps when called:

  1. parseResult 为 ParseText(offsetString, UTCOffset)。
  2. parseResult 为错误列表,返回 false
  3. 返回 true

21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )

The abstract operation ParseTimeZoneOffsetString takes argument offsetString (字符串) and returns 整数. It performs the following steps when called:

  1. parseResult 为 ParseText(offsetString, UTCOffset)。
  2. 断言:parseResult 非错误列表。
  3. 断言:parseResult 包含 ASCIISign 解析节点
  4. parsedSignparseResultASCIISign 解析节点匹配的源文本。
  5. parsedSign 为 U+002D(连字符),
    1. sign 为 -1。
  6. 否则,
    1. sign 为 1。
  7. 注:下列 StringToNumber 应用不会丢精度,因为每个解析值均为短数字字符串。
  8. 断言:parseResult 包含 Hour 解析节点
  9. parsedHoursparseResultHour 解析节点匹配的源文本。
  10. hours(StringToNumber(CodePointsToString(parsedHours)))。
  11. parseResult 不含 MinuteSecond 解析节点
    1. minutes 为 0。
  12. 否则,
    1. parsedMinutesparseResult 内第一个 MinuteSecond 解析节点匹配的源文本。
    2. minutes(StringToNumber(CodePointsToString(parsedMinutes)))。
  13. parseResult 不含两个 MinuteSecond 解析节点
    1. seconds 为 0。
  14. 否则,
    1. parsedSecondsparseResult 内第二个 MinuteSecond 解析节点匹配的源文本。
    2. seconds(StringToNumber(CodePointsToString(parsedSeconds)))。
  15. parseResult 不含 TemporalDecimalFraction 解析节点
    1. nanoseconds 为 0。
  16. 否则,
    1. parsedFractionparseResultTemporalDecimalFraction 解析节点匹配的源文本。
    2. fraction 为 CodePointsToString(parsedFraction) 与 "000000000" 的字符串拼接。
    3. nanosecondsStringfraction 的第 1 到第 10 位子串。
    4. nanoseconds(StringToNumber(nanosecondsString))。
  17. 返回 sign × (((hours × 60 + minutes) × 60 + seconds) × 109 + nanoseconds)。

21.4.2 Date 构造函数

Date 构造函数

  • %Date%
  • 是全局对象的 "Date" 属性的初始值。
  • 作为构造函数调用时,会创建并初始化一个新的 Date。
  • 作为函数而不是构造函数调用时,返回一个表示当前时间(UTC)的字符串。
  • 是一个行为根据参数数量和类型不同而不同的函数。
  • 可用作类定义的 extends 子句的值。打算继承指定 Date 行为的子类构造函数必须包含对 Date 构造函数super 调用,以创建并用 [[DateValue]] 内部槽初始化子类实例。

21.4.2.1 Date ( ...values )

当调用此函数时,执行以下步骤:

  1. 如果 NewTarget 是 undefined
    1. now 为标识当前时间的时间值(UTC)。
    2. 返回 ToDateString(now)。
  2. numberOfArgsvalues 中元素的数量。
  3. 如果 numberOfArgs = 0,
    1. dv 为标识当前时间的时间值(UTC)。
  4. 否则如果 numberOfArgs = 1,
    1. valuevalues[0]。
    2. 如果 value 是对象且有 [[DateValue]] 内部槽,
      1. tvvalue.[[DateValue]]
    3. 否则,
      1. v 为 ? ToPrimitive(value)。
      2. 如果 v 是字符串,
        1. 断言:下一步不会出现突然完成,因为 v 是字符串。
        2. tv 为按与 parse 方法完全相同的方式解析 v 作为日期的结果(21.4.3.2)。
      3. 否则,
        1. tv 为 ? ToNumber(v)。
    4. dvTimeClip(tv)。
  5. 否则,
    1. 断言:numberOfArgs ≥ 2。
    2. y 为 ? ToNumber(values[0])。
    3. m 为 ? ToNumber(values[1])。
    4. 如果 numberOfArgs > 2,令 dt 为 ? ToNumber(values[2]);否则令 dt1𝔽
    5. 如果 numberOfArgs > 3,令 h 为 ? ToNumber(values[3]);否则令 h+0𝔽
    6. 如果 numberOfArgs > 4,令 min 为 ? ToNumber(values[4]);否则令 min+0𝔽
    7. 如果 numberOfArgs > 5,令 s 为 ? ToNumber(values[5]);否则令 s+0𝔽
    8. 如果 numberOfArgs > 6,令 milli 为 ? ToNumber(values[6]);否则令 milli+0𝔽
    9. yrMakeFullYear(y)。
    10. finalDateMakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))。
    11. dvTimeClip(UTC(finalDate))。
  6. O 为 ? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] »)。
  7. 设置 O.[[DateValue]]dv
  8. 返回 O

21.4.3 Date 构造函数的属性

Date 构造函数

  • 拥有一个 [[Prototype]] 内部槽,其值为 %Function.prototype%
  • 拥有一个 "length" 属性,其值为 7𝔽
  • 拥有以下属性:

21.4.3.1 Date.now ( )

此函数返回调用时发生的 UTC 日期和时间的时间值

21.4.3.2 Date.parse ( string )

此函数对其参数应用 ToString 操作符。如果 ToString 结果为突然完成,则立即返回完成记录。否则,此函数将结果字符串解释为日期和时间;它返回一个数字,即对应于该日期和时间的 UTC 时间值。字符串可能会被解释为本地时间、UTC 时间或其他时区的时间,具体取决于字符串内容。该函数首先尝试按照 Date Time String Format(21.4.1.32)中描述的格式解析字符串,包括扩展年份。如果字符串不符合该格式,则函数可以回退到任何实现相关的启发式或实现相关的日期格式。不可识别或包含越界格式元素值的字符串会导致此函数返回 NaN

如果字符串符合 Date Time String Format,则使用替代值填补缺失的格式元素。当缺少 MMDD 元素时,使用 "01";当缺少 HHmmss 元素时,使用 "00";当缺少 sss 元素时,使用 "000"。当缺少 UTC 偏移表示时,仅日期形式按 UTC 时间解释,日期时间形式按本地时间解释。

如果 x 是在某个 ECMAScript 实现中的毫秒部分为零的 Date,则以下所有表达式在该实现中应产生相同的数值,只要所有引用的属性都为初始值:

x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())

然而,以下表达式

Date.parse(x.toLocaleString())

不要求与前三个表达式产生相同的数值,并且通常当此函数接收到任何不符合 Date Time String Format(21.4.1.32)且无法通过该实现的 toStringtoUTCString 方法产生的字符串值时,其产生的数值是实现定义的。

21.4.3.3 Date.prototype

Date.prototype 的初始值为 Date 原型对象

该属性具有属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.4.3.4 Date.UTC ( year [ , month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] ] )

调用此函数时,执行以下步骤:

  1. y 为 ? ToNumber(year)。
  2. 如果 month 存在,令 m 为 ? ToNumber(month);否则令 m+0𝔽
  3. 如果 date 存在,令 dt 为 ? ToNumber(date);否则令 dt1𝔽
  4. 如果 hours 存在,令 h 为 ? ToNumber(hours);否则令 h+0𝔽
  5. 如果 minutes 存在,令 min 为 ? ToNumber(minutes);否则令 min+0𝔽
  6. 如果 seconds 存在,令 s 为 ? ToNumber(seconds);否则令 s+0𝔽
  7. 如果 ms 存在,令 milli 为 ? ToNumber(ms);否则令 milli+0𝔽
  8. yrMakeFullYear(y)。
  9. 返回 TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)))。

此函数的 "length" 属性为 7𝔽

Note

此函数与 Date 构造函数有两个区别:它返回一个数字类型的时间值,而不是创建一个 Date,并且它以 UTC 解释参数而不是本地时间。

21.4.4 Date 原型对象的属性

Date 原型对象

  • %Date.prototype%
  • 自身是一个普通对象
  • 不是 Date 实例,也没有 [[DateValue]] 内部槽。
  • 有一个 [[Prototype]] 内部槽,其值为 %Object.prototype%

除非另有明确定义,下面定义的 Date 原型对象的方法不是泛型的,传递给它们的 this 值必须是具有并已初始化为时间值[[DateValue]] 内部槽的对象。

21.4.4.1 Date.prototype.constructor

Date.prototype.constructor 的初始值为 %Date%

21.4.4.2 Date.prototype.getDate ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 DateFromTime(LocalTime(t))。

21.4.4.3 Date.prototype.getDay ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 WeekDay(LocalTime(t))。

21.4.4.4 Date.prototype.getFullYear ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 YearFromTime(LocalTime(t))。

21.4.4.5 Date.prototype.getHours ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 HourFromTime(LocalTime(t))。

21.4.4.6 Date.prototype.getMilliseconds ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 msFromTime(LocalTime(t))。

21.4.4.7 Date.prototype.getMinutes ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 MinFromTime(LocalTime(t))。

21.4.4.8 Date.prototype.getMonth ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 MonthFromTime(LocalTime(t))。

21.4.4.9 Date.prototype.getSeconds ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 SecFromTime(LocalTime(t))。

21.4.4.10 Date.prototype.getTime ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. 返回 dateObject.[[DateValue]]

21.4.4.11 Date.prototype.getTimezoneOffset ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 (t - LocalTime(t)) / msPerMinute

21.4.4.12 Date.prototype.getUTCDate ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 DateFromTime(t)。

21.4.4.13 Date.prototype.getUTCDay ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 WeekDay(t)。

21.4.4.14 Date.prototype.getUTCFullYear ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 YearFromTime(t)。

21.4.4.15 Date.prototype.getUTCHours ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 HourFromTime(t)。

21.4.4.16 Date.prototype.getUTCMilliseconds ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 msFromTime(t)。

21.4.4.17 Date.prototype.getUTCMinutes ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 MinFromTime(t)。

21.4.4.18 Date.prototype.getUTCMonth ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 MonthFromTime(t)。

21.4.4.19 Date.prototype.getUTCSeconds ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,返回 NaN
  5. 返回 SecFromTime(t)。

21.4.4.20 Date.prototype.setDate ( date )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. dt 为 ? ToNumber(date)。
  5. 如果 tNaN,返回 NaN
  6. 设置 tLocalTime(t)。
  7. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))。
  8. uTimeClip(UTC(newDate))。
  9. 设置 dateObject.[[DateValue]]u
  10. 返回 u

21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , date ] ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. y 为 ? ToNumber(year)。
  5. 如果 tNaN,设置 t+0𝔽;否则设置 tLocalTime(t)。
  6. 如果 month 未传入,令 mMonthFromTime(t);否则令 m 为 ? ToNumber(month)。
  7. 如果 date 未传入,令 dtDateFromTime(t);否则令 dt 为 ? ToNumber(date)。
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t))。
  9. uTimeClip(UTC(newDate))。
  10. 设置 dateObject.[[DateValue]]u
  11. 返回 u

该方法的 "length" 属性为 3𝔽

Note

如果未传入 month,该方法表现为 monthgetMonth() 的值。如果未传入 date,则表现为 dategetDate() 的值。

21.4.4.22 Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. h 为 ? ToNumber(hour)。
  5. 如果传入 min,令 m 为 ? ToNumber(min)。
  6. 如果传入 sec,令 s 为 ? ToNumber(sec)。
  7. 如果传入 ms,令 milli 为 ? ToNumber(ms)。
  8. 如果 tNaN,返回 NaN
  9. 设置 tLocalTime(t)。
  10. 如果 min 未传入,令 mMinFromTime(t)。
  11. 如果 sec 未传入,令 sSecFromTime(t)。
  12. 如果 ms 未传入,令 millimsFromTime(t)。
  13. dateMakeDate(Day(t), MakeTime(h, m, s, milli))。
  14. uTimeClip(UTC(date))。
  15. 设置 dateObject.[[DateValue]]u
  16. 返回 u

该方法的 "length" 属性为 4𝔽

Note

如果未传入 min,该方法表现为 mingetMinutes() 的值。如果未传入 sec,表现为 secgetSeconds() 的值。如果未传入 ms,表现为 msgetMilliseconds() 的值。

21.4.4.23 Date.prototype.setMilliseconds ( ms )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 设置 ms 为 ? ToNumber(ms)。
  5. 如果 tNaN,返回 NaN
  6. 设置 tLocalTime(t)。
  7. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)。
  8. uTimeClip(UTC(MakeDate(Day(t), time)))。
  9. 设置 dateObject.[[DateValue]]u
  10. 返回 u

21.4.4.24 Date.prototype.setMinutes ( min [ , sec [ , ms ] ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. m 为 ? ToNumber(min)。
  5. 如果传入 sec,令 s 为 ? ToNumber(sec)。
  6. 如果传入 ms,令 milli 为 ? ToNumber(ms)。
  7. 如果 tNaN,返回 NaN
  8. 设置 tLocalTime(t)。
  9. 如果 sec 未传入,令 sSecFromTime(t)。
  10. 如果 ms 未传入,令 millimsFromTime(t)。
  11. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli))。
  12. uTimeClip(UTC(date))。
  13. 设置 dateObject.[[DateValue]]u
  14. 返回 u

该方法的 "length" 属性为 3𝔽

Note

如果未传入 sec,该方法表现为 secgetSeconds() 的值。如果未传入 ms,表现为 msgetMilliseconds() 的值。

21.4.4.25 Date.prototype.setMonth ( month [ , date ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. m 为 ? ToNumber(month)。
  5. 如果传入 date,令 dt 为 ? ToNumber(date)。
  6. 如果 tNaN,返回 NaN
  7. 设置 tLocalTime(t)。
  8. 如果 date 未传入,令 dtDateFromTime(t)。
  9. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))。
  10. uTimeClip(UTC(newDate))。
  11. 设置 dateObject.[[DateValue]]u
  12. 返回 u

该方法的 "length" 属性为 2𝔽

Note

如果未传入 date,该方法表现为 dategetDate() 的值。

21.4.4.26 Date.prototype.setSeconds ( sec [ , ms ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. s 为 ? ToNumber(sec)。
  5. 如果传入 ms,令 milli 为 ? ToNumber(ms)。
  6. 如果 tNaN,返回 NaN
  7. 设置 tLocalTime(t)。
  8. 如果 ms 未传入,令 millimsFromTime(t)。
  9. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))。
  10. uTimeClip(UTC(date))。
  11. 设置 dateObject.[[DateValue]]u
  12. 返回 u

该方法的 "length" 属性为 2𝔽

Note

如果未传入 ms,该方法表现为 msgetMilliseconds() 的值。

21.4.4.27 Date.prototype.setTime ( time )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. t 为 ? ToNumber(time)。
  4. vTimeClip(t)。
  5. 设置 dateObject.[[DateValue]]v
  6. 返回 v

21.4.4.28 Date.prototype.setUTCDate ( date )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. dt 为 ? ToNumber(date)。
  5. 如果 tNaN,返回 NaN
  6. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))。
  7. vTimeClip(newDate)。
  8. 设置 dateObject.[[DateValue]]v
  9. 返回 v

21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 如果 tNaN,设置 t+0𝔽
  5. y 为 ? ToNumber(year)。
  6. 如果 month 未传入,令 mMonthFromTime(t);否则令 m 为 ? ToNumber(month)。
  7. 如果 date 未传入,令 dtDateFromTime(t);否则令 dt 为 ? ToNumber(date)。
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t))。
  9. vTimeClip(newDate)。
  10. 设置 dateObject.[[DateValue]]v
  11. 返回 v

该方法的 "length" 属性为 3𝔽

Note

如果未传入 month,该方法表现为 monthgetUTCMonth() 的值。如果未传入 date,则表现为 dategetUTCDate() 的值。

21.4.4.30 Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. h 为 ? ToNumber(hour)。
  5. 如果传入 min,令 m 为 ? ToNumber(min)。
  6. 如果传入 sec,令 s 为 ? ToNumber(sec)。
  7. 如果传入 ms,令 milli 为 ? ToNumber(ms)。
  8. 如果 tNaN,返回 NaN
  9. 如果 min 未传入,令 mMinFromTime(t)。
  10. 如果 sec 未传入,令 sSecFromTime(t)。
  11. 如果 ms 未传入,令 millimsFromTime(t)。
  12. dateMakeDate(Day(t), MakeTime(h, m, s, milli))。
  13. vTimeClip(date)。
  14. 设置 dateObject.[[DateValue]]v
  15. 返回 v

该方法的 "length" 属性为 4𝔽

Note

如果未传入 min,该方法表现为 mingetUTCMinutes() 的值。如果未传入 sec,表现为 secgetUTCSeconds() 的值。如果未传入 ms,表现为 msgetUTCMilliseconds() 的值。

21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. 设置 ms 为 ? ToNumber(ms)。
  5. 如果 tNaN,返回 NaN
  6. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)。
  7. vTimeClip(MakeDate(Day(t), time))。
  8. 设置 dateObject.[[DateValue]]v
  9. 返回 v

21.4.4.32 Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. m 为 ? ToNumber(min)。
  5. 如果传入 sec,令 s 为 ? ToNumber(sec)。
  6. 如果传入 ms,令 milli 为 ? ToNumber(ms)。
  7. 如果 tNaN,返回 NaN
  8. 如果 sec 未传入,令 sSecFromTime(t)。
  9. 如果 ms 未传入,令 millimsFromTime(t)。
  10. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli))。
  11. vTimeClip(date)。
  12. 设置 dateObject.[[DateValue]]v
  13. 返回 v

该方法的 "length" 属性为 3𝔽

Note

如果未传入 sec,该方法表现为 secgetUTCSeconds() 的值。如果未传入 ms,表现为 msgetUTCMilliseconds() 的值。

21.4.4.33 Date.prototype.setUTCMonth ( month [ , date ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. m 为 ? ToNumber(month)。
  5. 如果传入 date,令 dt 为 ? ToNumber(date)。
  6. 如果 tNaN,返回 NaN
  7. 如果 date 未传入,令 dtDateFromTime(t)。
  8. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))。
  9. vTimeClip(newDate)。
  10. 设置 dateObject.[[DateValue]]v
  11. 返回 v

该方法的 "length" 属性为 2𝔽

Note

如果未传入 date,该方法表现为 dategetUTCDate() 的值。

21.4.4.34 Date.prototype.setUTCSeconds ( sec [ , ms ] )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tdateObject.[[DateValue]]
  4. s 为 ? ToNumber(sec)。
  5. 如果传入 ms,令 milli 为 ? ToNumber(ms)。
  6. 如果 tNaN,返回 NaN
  7. 如果 ms 未传入,令 millimsFromTime(t)。
  8. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))。
  9. vTimeClip(date)。
  10. 设置 dateObject.[[DateValue]]v
  11. 返回 v

该方法的 "length" 属性为 2𝔽

Note

如果未传入 ms,该方法表现为 msgetUTCMilliseconds() 的值。

21.4.4.35 Date.prototype.toDateString ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tvdateObject.[[DateValue]]
  4. 如果 tvNaN,返回 "Invalid Date"
  5. tLocalTime(tv)。
  6. 返回 DateString(t)。

21.4.4.36 Date.prototype.toISOString ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tvdateObject.[[DateValue]]
  4. 如果 tvNaN,抛出 RangeError 异常。
  5. 断言:tv 是整数类型的数字。
  6. 如果 tv 对应的年份无法在 Date Time String Format 中表示,抛出 RangeError 异常。
  7. 返回 tv 在 UTC 时间轴上的 Date Time String Format 字符串表示,包括所有格式元素和 UTC 偏移表示 "Z"

21.4.4.37 Date.prototype.toJSON ( key )

此方法为 JSON.stringify (25.5.2) 提供 Date 的字符串表示。

调用此方法时,执行以下步骤:

  1. O 为 ? ToObject(this 值)。
  2. tv 为 ? ToPrimitive(O, number)。
  3. 如果 tv 是数字且不是有限值,返回 null
  4. 返回 ? Invoke(O, "toISOString")。
Note 1

参数会被忽略。

Note 2

此方法有意设计为泛型;它不要求其 this 值为 Date。因此,它可以被转移到其他类型的对象上作为方法使用。但要求该对象有 toISOString 方法。

21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按照 ECMA-402 规范实现此方法。如果 ECMAScript 实现不包含 ECMA-402 API,则使用以下规范:

此方法返回一个字符串值。字符串内容由实现定义,但旨在以主机环境当前区域设置的习惯用法,以便捷、易读的方式表示当前时区中的 Date 的“日期”部分。

此方法的可选参数含义在 ECMA-402 规范中定义;不支持 ECMA-402 的实现不得在这些参数位置使用其他含义。

21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按照 ECMA-402 规范实现此方法。如果 ECMAScript 实现不包含 ECMA-402 API,则使用以下规范:

此方法返回一个字符串值。字符串内容由实现定义,但旨在以主机环境当前区域设置的习惯用法,以便捷、易读的方式表示当前时区中的 Date。

此方法的可选参数含义在 ECMA-402 规范中定义;不支持 ECMA-402 的实现不得在这些参数位置使用其他含义。

21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按照 ECMA-402 规范实现此方法。如果 ECMAScript 实现不包含 ECMA-402 API,则使用以下规范:

此方法返回一个字符串值。字符串内容由实现定义,但旨在以主机环境当前区域设置的习惯用法,以便捷、易读的方式表示当前时区中的 Date 的“时间”部分。

此方法的可选参数含义在 ECMA-402 规范中定义;不支持 ECMA-402 的实现不得在这些参数位置使用其他含义。

21.4.4.41 Date.prototype.toString ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tvdateObject.[[DateValue]]
  4. 返回 ToDateString(tv)。
Note 1

对于任何 Date d,只要 d.[[DateValue]] 能被 1000 整除,则 Date.parse(d.toString()) = d.valueOf(),详见 21.4.3.2

Note 2

此方法不是泛型的;如果 this 值不是 Date,则抛出 TypeError 异常。因此,不能将其作为方法转移到其他类型对象。

21.4.4.41.1 TimeString ( tv )

The abstract operation TimeString takes argument tv (一个数字,但不是 NaN) and returns 一个字符串. It performs the following steps when called:

  1. hourToZeroPaddedDecimalString((HourFromTime(tv)), 2)。
  2. minuteToZeroPaddedDecimalString((MinFromTime(tv)), 2)。
  3. secondToZeroPaddedDecimalString((SecFromTime(tv)), 2)。
  4. 返回 hour":"minute":"second、码元 0x0020(空格)、"GMT" 的字符串拼接结果。

21.4.4.41.2 DateString ( tv )

The abstract operation DateString takes argument tv (一个数字,但不是 NaN) and returns 一个字符串. It performs the following steps when called:

  1. weekdayTable 63WeekDay(tv) 的 Name。
  2. monthTable 64MonthFromTime(tv) 的 Name。
  3. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2)。
  4. yvYearFromTime(tv)。
  5. 如果 yv+0𝔽yv > +0𝔽,令 yearSign 为空字符串;否则令 yearSign"-"
  6. paddedYearToZeroPaddedDecimalString(abs((yv)), 4)。
  7. 返回 weekday、码元 0x0020(空格)、month、码元 0x0020(空格)、day、码元 0x0020(空格)、yearSignpaddedYear 的字符串拼接结果。
Table 63: 一周中各天的名称
Number Name
+0𝔽 "Sun"
1𝔽 "Mon"
2𝔽 "Tue"
3𝔽 "Wed"
4𝔽 "Thu"
5𝔽 "Fri"
6𝔽 "Sat"
Table 64: 一年中各月的名称
Number Name
+0𝔽 "Jan"
1𝔽 "Feb"
2𝔽 "Mar"
3𝔽 "Apr"
4𝔽 "May"
5𝔽 "Jun"
6𝔽 "Jul"
7𝔽 "Aug"
8𝔽 "Sep"
9𝔽 "Oct"
10𝔽 "Nov"
11𝔽 "Dec"

21.4.4.41.3 TimeZoneString ( tv )

The abstract operation TimeZoneString takes argument tv (一个整数类型的数字) and returns 一个字符串. It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier()。
  2. 如果 IsTimeZoneOffsetString(systemTimeZoneIdentifier) 是 true
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)。
  3. 否则,
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((tv) × 106))。
  4. offset𝔽(truncate(offsetNs / 106))。
  5. 如果 offset+0𝔽offset > +0𝔽
    1. offsetSign"+"
    2. absOffsetoffset
  6. 否则,
    1. offsetSign"-"
    2. absOffset 为 -offset
  7. offsetMinToZeroPaddedDecimalString((MinFromTime(absOffset)), 2)。
  8. offsetHourToZeroPaddedDecimalString((HourFromTime(absOffset)), 2)。
  9. tzName 为实现定义的字符串,可以为空字符串,也可以是码元 0x0020(空格)、码元 0x0028(左括号)、实现定义的时区名称和码元 0x0029(右括号)拼接的字符串。
  10. 返回 offsetSignoffsetHouroffsetMintzName 的字符串拼接结果。

21.4.4.41.4 ToDateString ( tv )

The abstract operation ToDateString takes argument tv (一个整数类型的数字或 NaN) and returns 一个字符串. It performs the following steps when called:

  1. 如果 tvNaN,返回 "Invalid Date"
  2. tLocalTime(tv)。
  3. 返回 DateString(t)、码元 0x0020(空格)、TimeString(t)、TimeZoneString(tv) 的字符串拼接结果。

21.4.4.42 Date.prototype.toTimeString ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tvdateObject.[[DateValue]]
  4. 如果 tvNaN,返回 "Invalid Date"
  5. tLocalTime(tv)。
  6. 返回 TimeString(t) 和 TimeZoneString(tv) 的字符串拼接结果。

21.4.4.43 Date.prototype.toUTCString ( )

此方法返回一个字符串值,表示与 this 值对应的时间点。字符串格式基于 RFC 7231 的 "HTTP-date",并加以泛化以支持 ECMAScript Date 支持的完整时间范围。

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. tvdateObject.[[DateValue]]
  4. 如果 tvNaN,返回 "Invalid Date"
  5. weekdayTable 63WeekDay(tv) 的 Name。
  6. monthTable 64MonthFromTime(tv) 的 Name。
  7. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2)。
  8. yvYearFromTime(tv)。
  9. 如果 yv+0𝔽yv > +0𝔽,令 yearSign 为空字符串;否则令 yearSign"-"
  10. paddedYearToZeroPaddedDecimalString(abs((yv)), 4)。
  11. 返回 weekday","、码元 0x0020(空格)、day、码元 0x0020(空格)、month、码元 0x0020(空格)、yearSignpaddedYear、码元 0x0020(空格)、TimeString(tv) 的字符串拼接结果。

21.4.4.44 Date.prototype.valueOf ( )

调用此方法时,执行以下步骤:

  1. dateObjectthis 值。
  2. 执行 ? RequireInternalSlot(dateObject, [[DateValue]])。
  3. 返回 dateObject.[[DateValue]]

21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )

此方法由 ECMAScript 语言运算符调用,用于将 Date 转换为原始值。hint 的允许值为 "default""number""string"。Date 在所有内建 ECMAScript 对象中是独特的,因为它将 "default" 视为等同于 "string",而其他内建对象则将 "default" 视为等同于 "number"

调用此方法时,执行以下步骤:

  1. Othis 值。
  2. 如果 O 不是对象,抛出 TypeError 异常。
  3. 如果 hint"string""default"
    1. tryFirststring
  4. 否则如果 hint"number"
    1. tryFirstnumber
  5. 否则,
    1. 抛出 TypeError 异常。
  6. 返回 ? OrdinaryToPrimitive(O, tryFirst)。

此属性具有 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 属性。

该方法的 "name" 属性值为 "[Symbol.toPrimitive]"

21.4.5 Date 实例的属性

Date 实例是普通对象,继承自 Date 原型对象的属性。Date 实例还拥有 [[DateValue]] 内部槽。[[DateValue]] 内部槽是该 Date 所表示的时间值