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 。作为 MillisecondsPerDay 整数 倍的有限时间值(即对于某个整数 d ,其值为 MillisecondsPerDay × d )表示这样一个时刻:从纪元 起经过 d 个完整 UTC 日后(当 d 为负数时则在纪元 之前)的 UTC 日开始时刻。其他每个有限时间值 tv 都相对于其之前满足这种倍数关系的最大有限时间值 s 来定义,并表示与 s 位于同一 UTC 日内、但比它晚 (tv - s ) 毫秒的时刻。
时间值不考虑 UTC 闰秒——没有表示正闰秒期间时刻的时间值,而被负闰秒从 UTC 时间线中移除的时刻仍有相应时间值。不过,时间值的定义仍会与 UTC 分段对齐,只有在闰秒边界处存在不连续,并且在闰秒之外差值为零。
Number 可以精确表示从 -9,007,199,254,740,992 到 9,007,199,254,740,992 的所有整数 (21.1.2.8 和 21.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 𝔽 表示。
注
在外推格里高利历中,闰年恰好是能被 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
MillisecondsPerSecond = 1000
NanosecondsPerMillisecond = 106
NanosecondsPerMicrosecond = 103
21.4.1.3 Day ( tv )
抽象操作 Day,接收参数 tv (a finite time value);返回值:整数 。 它返回 tv 所在日期的日编号。 调用时执行以下步骤:
返回 floor (ℝ (tv ) / MillisecondsPerDay )。
21.4.1.4 TimeWithinDay ( tv )
抽象操作 TimeWithinDay,接收参数 tv (a finite time value);返回值:an integer in the interval from 0 (inclusive) to MillisecondsPerDay (exclusive)。 它返回自 tv 所在日期开始以来经过的毫秒数。 调用时执行以下步骤:
返回 ℝ (tv ) modulo MillisecondsPerDay 。
21.4.1.5 DayFromYear ( y )
抽象操作 DayFromYear,接收参数 y (整数 );返回值:整数 。 它返回年份 y 第一天的日编号。 调用时执行以下步骤:
注 :在以下步骤中,numberYears1 、numberYears4 、numberYears100 和 numberYears400 分别表示在纪元 与年份 y 开始之间出现的可被 1、4、100 和 400 整除的年份数量。如果 y 位于纪元 之前,则该数量为负。令 numberYears1 为 (y - 1970)。 令 numberYears4 为 floor ((y - 1969) / 4)。 令 numberYears100 为 floor ((y - 1901) / 100)。 令 numberYears400 为 floor ((y - 1601) / 400)。 返回 365 × numberYears1 + numberYears4 - numberYears100 + numberYears400 。
21.4.1.6 TimeFromYear ( y )
抽象操作 TimeFromYear,接收参数 y (整数 );返回值:a time value。 它返回年份 y 开始时的时间值 。 调用时执行以下步骤:
返回 𝔽 (MillisecondsPerDay × DayFromYear (y ))。
21.4.1.7 YearFromTime ( tv )
抽象操作 YearFromTime,接收参数 tv (a finite time value);返回值:整数 。 它返回 tv 所在的年份。 调用时执行以下步骤:
返回满足 TimeFromYear (y ) ≤ tv 的最大整数 y (最接近 +∞)。
21.4.1.8 DayWithinYear ( tv )
抽象操作 DayWithinYear,接收参数 tv (a finite time value);返回值:an integer in the inclusive interval from 0 to 365。 调用时执行以下步骤:
返回 Day (tv ) - DayFromYear (YearFromTime (tv ))。
21.4.1.9 InLeapYear ( tv )
抽象操作 InLeapYear,接收参数 tv (a finite time value);返回值:(0 或 1)。 如果 tv 位于闰年中,则返回 1,否则返回 0。 调用时执行以下步骤:
令 y 为 YearFromTime (tv )。 如果 (y modulo 400) = 0,则返回 1。 如果 (y modulo 100) = 0,则返回 0。 如果 (y modulo 4) = 0,则返回 1。 返回 0。
21.4.1.10 MonthFromTime ( tv )
抽象操作 MonthFromTime,接收参数 tv (a finite time value);返回值:an integer in the inclusive interval from 0 to 11。 它返回一个整数 ,用于标识 tv 所在的月份。月份值 0 表示一月;1 表示二月;2 表示三月;3 表示四月;4 表示五月;5 表示六月;6 表示七月;7 表示八月;8 表示九月;9 表示十月;10 表示十一月;11 表示十二月。注 意,MonthFromTime(+0 𝔽 ) = 0 ,对应 1970 年 1 月 1 日星期四。 调用时执行以下步骤:
令 inLeapYear 为 InLeapYear (tv )。 令 dayWithinYear 为 DayWithinYear (tv )。 如果 dayWithinYear < 31,则返回 0。 如果 dayWithinYear < 59 + inLeapYear ,则返回 1。 如果 dayWithinYear < 90 + inLeapYear ,则返回 2。 如果 dayWithinYear < 120 + inLeapYear ,则返回 3。 如果 dayWithinYear < 151 + inLeapYear ,则返回 4。 如果 dayWithinYear < 181 + inLeapYear ,则返回 5。 如果 dayWithinYear < 212 + inLeapYear ,则返回 6。 如果 dayWithinYear < 243 + inLeapYear ,则返回 7。 如果 dayWithinYear < 273 + inLeapYear ,则返回 8。 如果 dayWithinYear < 304 + inLeapYear ,则返回 9。 如果 dayWithinYear < 334 + inLeapYear ,则返回 10。 断言 :dayWithinYear < 365 + inLeapYear 。返回 11。
21.4.1.11 DateFromTime ( tv )
抽象操作 DateFromTime,接收参数 tv (a finite time value);返回值:an integer in the inclusive interval from 1 to 31。 它返回 tv 所在月份中的日期。 调用时执行以下步骤:
令 inLeapYear 为 InLeapYear (tv )。 令 dayWithinYear 为 DayWithinYear (tv )。 令 month 为 MonthFromTime (tv )。 如果 month = 0,则返回 dayWithinYear + 1。 如果 month = 1,则返回 dayWithinYear - 30。 如果 month = 2,则返回 dayWithinYear - 58 - inLeapYear 。 如果 month = 3,则返回 dayWithinYear - 89 - inLeapYear 。 如果 month = 4,则返回 dayWithinYear - 119 - inLeapYear 。 如果 month = 5,则返回 dayWithinYear - 150 - inLeapYear 。 如果 month = 6,则返回 dayWithinYear - 180 - inLeapYear 。 如果 month = 7,则返回 dayWithinYear - 211 - inLeapYear 。 如果 month = 8,则返回 dayWithinYear - 242 - inLeapYear 。 如果 month = 9,则返回 dayWithinYear - 272 - inLeapYear 。 如果 month = 10,则返回 dayWithinYear - 303 - inLeapYear 。 断言 :month = 11。返回 dayWithinYear - 333 - inLeapYear 。
21.4.1.12 WeekDay ( tv )
抽象操作 WeekDay,接收参数 tv (a finite time value);返回值:an integer in the inclusive interval from 0 to 6。 它返回一个整数 ,用于标识 tv 所在的是一周中的哪一天。星期值 0 表示星期日;1 表示星期一;2 表示星期二;3 表示星期三;4 表示星期四;5 表示星期五;6 表示星期六。注 意,WeekDay(+0 𝔽 ) = 4 ,对应 1970 年 1 月 1 日星期四。 调用时执行以下步骤:
返回 (Day (tv ) + 4) modulo 7。
21.4.1.13 HourFromTime ( tv )
抽象操作 HourFromTime,接收参数 tv (a finite time value);返回值:an integer in the inclusive interval from 0 to 23。 它返回 tv 所在一天中的小时。 调用时执行以下步骤:
返回 floor (ℝ (tv ) / MillisecondsPerHour ) modulo HoursPerDay 。
21.4.1.14 MinuteFromTime ( tv )
抽象操作 MinuteFromTime,接收参数 tv (a finite time value);返回值:an integer in the inclusive interval from 0 to 59。 它返回 tv 所在小时中的分钟。 调用时执行以下步骤:
返回 floor (ℝ (tv ) / MillisecondsPerMinute ) modulo MinutesPerHour 。
21.4.1.15 SecondFromTime ( tv )
抽象操作 SecondFromTime,接收参数 tv (a finite time value);返回值:an integer in the inclusive interval from 0 to 59。 它返回 tv 所在分钟中的秒。 调用时执行以下步骤:
返回 floor (ℝ (tv ) / MillisecondsPerSecond ) modulo SecondsPerMinute 。
21.4.1.16 MillisecondFromTime ( tv )
抽象操作 MillisecondFromTime,接收参数 tv (a finite time value);返回值:an integer in the inclusive interval from 0 to 999。 它返回 tv 所在秒中的毫秒。 调用时执行以下步骤:
返回 ℝ (tv ) modulo MillisecondsPerSecond 。
21.4.1.17 纪元纳秒和范围
纪元纳秒计数 是表示具有纳秒精度时间瞬间的整数 。它支持与时间值 相同的范围,但以纳秒表示,从 MinEpochNanoseconds 到 MaxEpochNanoseconds 。不存在与时间值 NaN 等价的纳秒表示;没有用于表示无特定时间瞬间的表示。
1970 年 1 月 1 日 UTC 零时这一精确时刻由值 0 表示。最大值是 MaxEpochNanoseconds ,最小值是 MinEpochNanoseconds 。
21.4.1.18 GetUTCEpochNanoseconds ( year , month , day , hour , minute , second , millisecond , microsecond , nanosecond )
抽象操作 GetUTCEpochNanoseconds,接收参数 year (整数 )、month (an integer in the inclusive interval from 1 to 12)、day (an integer in the inclusive interval from 1 to 31)、hour (an integer in the inclusive interval from 0 to 23)、minute (an integer in the inclusive interval from 0 to 59)、second (an integer in the inclusive interval from 0 to 59)、millisecond (an integer in the inclusive interval from 0 to 999)、microsecond (an integer in the inclusive interval from 0 to 999) 和 nanosecond (an integer in the inclusive interval from 0 to 999);返回值:an epoch nanoseconds count。 返回值是与给定 UTC 中的 ISO 8601 日历日期和墙上时钟时间相对应的纪元纳秒计数 。 调用时执行以下步骤:
令 date 为 MakeDay (𝔽 (year ), 𝔽 (month - 1), 𝔽 (day ))。 令 time 为 MakeTime (𝔽 (hour ), 𝔽 (minute ), 𝔽 (second ), 𝔽 (millisecond ))。 令 epochMilliseconds 为 MakeDate (date , time )。 断言 :epochMilliseconds 是整数 Number 。返回 ℝ (epochMilliseconds ) × NanosecondsPerMillisecond + microsecond × NanosecondsPerMicrosecond + nanosecond 。
21.4.1.19 时区标识符
ECMAScript 中的时区由时区标识符 表示,它们是完全由从 0x0000 到 0x007F 闭区间 中的码元组成的 String。
ECMAScript 实现支持的时区可以是可用命名时区 ,由 AvailableNamedTimeZoneIdentifiers 返回的 Time Zone Identifier Record 的 [[Identifier]] 字段表示;也可以是偏移时区 ,由使 IsTimeZoneOffsetString 返回 true 的 String 表示。
主时区标识符 是可用命名时区的首选标识符。
非主时区标识符 是可用命名时区的标识符,但不是主时区标识符。
可用命名时区标识符 要么是主时区标识符,要么是非主时区标识符。
每个可用命名时区标识符都恰好与一个可用命名时区关联。
每个可用命名时区都恰好与一个主时区标识符以及零个或多个非主时区标识符关联。
ECMAScript 实现必须支持标识符为 "UTC" 的可用命名时区,该标识符必须是 UTC 时区的主时区标识符。
此外,实现可以支持任意数量的其他可用命名时区。
遵循 ECMA-402 国际化 API 规范中所述时区要求的实现称为时区感知 实现。
时区感知实现必须支持与 IANA 时区数据库 中的“Zone”和“Link ”名称对应的可用命名时区,并且只能支持这些名称。
在时区感知实现中,除 ECMA-402 中规定的 AvailableNamedTimeZoneIdentifiers 明确覆盖 的情况外,主时区标识符和非主时区标识符分别是 IANA 时区数据库中的“Zone”名称和“Link ”名称。
不支持完整 IANA 时区数据库的实现仍建议使用 IANA 时区数据库名称作为表示时区的标识符。
21.4.1.20 GetNamedTimeZoneEpochNanoseconds ( timeZoneIdentifier , year , month , day , hour , minute , second , millisecond , microsecond , nanosecond )
实现定义的抽象操作 GetNamedTimeZoneEpochNanoseconds,接收参数 timeZoneIdentifier (String)、year (整数 )、month (an integer in the inclusive interval from 1 to 12)、day (an integer in the inclusive interval from 1 to 31)、hour (an integer in the inclusive interval from 0 to 23)、minute (an integer in the inclusive interval from 0 to 59)、second (an integer in the inclusive interval from 0 to 59)、millisecond (an integer in the inclusive interval from 0 to 999)、microsecond (an integer in the inclusive interval from 0 to 999) 和 nanosecond (an integer in the inclusive interval from 0 to 999);返回值:列表 (元素:epoch nanoseconds counts )。
返回 List 中的每个值都表示一个纪元纳秒计数 ,该计数与由 timeZoneIdentifier 标识的命名时区中的给定 ISO 8601 日历日期和墙上时钟时间相对应。
当输入表示因负向时区转换而出现多次的本地时间时(例如夏令时结束,或因时区规则变更而减小时区偏移),返回的 List 将包含 多个元素,并按数值升序排序。
当输入表示因正向时区转换而被跳过的本地时间时(例如夏令时开始,或因时区规则变更而增大时区偏移),返回的 List 将为空。
否则,返回的 List 将包含 一个元素。
用于不包含 任何时区本地政治规则的 ECMAScript 实现的 GetNamedTimeZoneEpochNanoseconds 默认实现,在调用时执行以下步骤:
断言 :timeZoneIdentifier 是 "UTC" 。令 epochNanoseconds 为 GetUTCEpochNanoseconds (year , month , day , hour , minute , second , millisecond , microsecond , nanosecond )。 返回 « epochNanoseconds »。
注
要求时区感知 实现(并建议所有其他实现)使用 IANA 时区数据库 中的时区信息。
America/New_York 中 2017 年 11 月 5 日凌晨 1:30 会重复两次,因此 GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 11, 5, 1, 30, 0, 0, 0, 0) 将返回长度为 2 的 List ,其中第一个元素表示 UTC 05:30(对应 UTC 偏移 -04:00 的美国东部夏令时间 01:30),第二个元素表示 UTC 06:30(对应 UTC 偏移 -05:00 的美国东部标准时间 01:30)。
America/New_York 中 2017 年 3 月 12 日凌晨 2:30 不存在,因此 GetNamedTimeZoneEpochNanoseconds("America/New_York" , 2017, 3, 12, 2, 30, 0, 0, 0, 0) 将返回空 List 。
21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier , epochNanoseconds )
实现定义的抽象操作 GetNamedTimeZoneOffsetNanoseconds,接收参数 timeZoneIdentifier (String) 和 epochNanoseconds (an epoch nanoseconds count);返回值:整数 。
返回的整数 表示由 timeZoneIdentifier 标识的命名时区,在与纪元纳秒计数 epochNanoseconds 对应的时刻相对于 UTC 的偏移,以纳秒为单位。
用于不包含 任何时区本地政治规则的 ECMAScript 实现的 GetNamedTimeZoneOffsetNanoseconds 默认实现,在调用时执行以下步骤:
断言 :timeZoneIdentifier 是 "UTC" 。返回 0。
注
21.4.1.22 Time Zone Identifier Record
Time Zone Identifier Record 是用于描述可用命名时区标识符 及其对应主时区标识符 的 Record 。
Time Zone Identifier Record 具有 表 60 中列出的字段。
表 60: Time Zone Identifier Record 字段
字段名称
值
含义
[[Identifier]]
a String
实现支持的可用命名时区标识符 。
[[PrimaryIdentifier]]
a String
[[Identifier]] 解析到的主时区标识符 。
注
如果 [[Identifier]] 是主时区标识符 ,则 [[Identifier]] 就是 [[PrimaryIdentifier]] 。
21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )
实现定义的抽象操作 AvailableNamedTimeZoneIdentifiers,接收无参数;返回值:列表 (元素:Time Zone Identifier 记录 )。
其结果描述此实现中的所有可用命名时区标识符 ,以及与每个可用命名时区标识符 对应的主时区标识符 。
该 List 按每个 Time Zone Identifier Record 的 [[Identifier]] 字段排序。
时区感知 实现(包括所有实现 ECMA-402 国际化 API 的实现)必须按照 ECMA-402 的规定实现 AvailableNamedTimeZoneIdentifiers 抽象操作 。
否则,AvailableNamedTimeZoneIdentifiers 在调用时执行以下步骤:
如果实现不包含 任何时区的本地政治规则,则返回 « Time Zone Identifier Record { [[Identifier]] : "UTC" , [[PrimaryIdentifier]] : "UTC" } »。 令 identifiers 为唯一可用命名时区标识符 的 List ,按字典序码元顺序排序。 令 result 为新的空 List 。 对 identifiers 的每个元素 identifier ,执行令 primary 为 identifier 。 如果 identifier 是此实现中的非主时区标识符 且 identifier 不是 "UTC" ,则将 primary 设置为与 identifier 关联的主时区标识符 。 注 :实现可能需要迭代解析 identifier ,以获得主时区标识符 。 令 record 为 Time Zone Identifier Record { [[Identifier]] : identifier , [[PrimaryIdentifier]] : primary }。 将 record 追加到 result 。 断言 :result 包含 一个 Time Zone Identifier Record record ,使得 record .[[Identifier]] 是 "UTC" 且 record .[[PrimaryIdentifier]] 是 "UTC" 。返回 result 。
21.4.1.24 SystemTimeZoneIdentifier ( )
实现定义的抽象操作 SystemTimeZoneIdentifier,接收无参数;返回值:String。
它返回表示宿主环境 当前时区的 String,该 String 要么表示一个使 IsTimeZoneOffsetString 返回 true 的 UTC 偏移,要么是主时区标识符 。
调用时执行以下步骤:
如果实现仅支持 UTC 时区,则返回 "UTC" 。 令 systemTimeZoneString 为表示宿主环境 当前时区的 String,它要么是主时区标识符 ,要么是偏移时区 标识符。 返回 systemTimeZoneString 。
注
为确保实现通常在 Date 对象方法中提供的功能级别,如果存在与宿主环境 时区设置对应的 IANA 时区名称,建议 SystemTimeZoneIdentifier 返回该名称。
如果该时区存在标准时间和夏令时的本地政治规则,则 GetNamedTimeZoneEpochNanoseconds 和 GetNamedTimeZoneOffsetNanoseconds 必须反映这些规则。
例如,如果宿主环境 是在用户选择美国东部时间作为时区的系统上运行的浏览器,则 SystemTimeZoneIdentifier 返回 "America/New_York" 。
21.4.1.25 LocalTime ( tv )
抽象操作 LocalTime,接收参数 tv (a finite time value);返回值:整数 Number 。
它将 tv 从 UTC 转换为本地时间。
应按照本节规定的方式,使用在 tv 时有效的标准时间和夏令时本地政治规则来确定结果。
调用时执行以下步骤:
令 systemTimeZoneIdentifier 为 SystemTimeZoneIdentifier ()。 如果 IsTimeZoneOffsetString (systemTimeZoneIdentifier ) 是 true ,则令 offsetNanoseconds 为 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )。 否则,令 offsetNanoseconds 为 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , ℝ (tv ) × NanosecondsPerMillisecond )。 令 offsetMilliseconds 为 truncate (offsetNanoseconds / NanosecondsPerMillisecond )。 返回 tv + 𝔽 (offsetMilliseconds )。
注 1
注 2
要求时区感知 实现(并建议所有其他实现)使用 IANA 时区数据库 https://www.iana.org/time-zones/ 中的时区信息。
注 3
在负向时区转换中存在重复时间时(例如夏令时结束或时区调整减小时),两个不同的输入时间值 tv UTC 会被转换为同一个本地时间 tlocal 。
LocalTime(UTC (tv local )) 不一定始终等于 tv local 。相应地,UTC (LocalTime(tv UTC )) 也不一定始终等于 tv UTC 。
21.4.1.26 UTC ( t )
抽象操作 UTC,接收参数 t (Number);返回值:a time value。
它将 t 从本地时间转换为 UTC 时间值 。
应按照本节规定的方式,使用在 t 时有效的标准时间和夏令时本地政治规则来确定结果。
调用时执行以下步骤:
如果 t 不是有限 Number ,返回 NaN 。 令 systemTimeZoneIdentifier 为 SystemTimeZoneIdentifier ()。 如果 IsTimeZoneOffsetString (systemTimeZoneIdentifier ) 是 true ,则令 offsetNanoseconds 为 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )。 否则,令 possibleInstants 为 GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier , YearFromTime (t ), MonthFromTime (t ) + 1, DateFromTime (t ), HourFromTime (t ), MinuteFromTime (t ), SecondFromTime (t ), MillisecondFromTime (t ), 0, 0)。 注 :以下步骤确保,当 t 表示在负向时区转换时重复多次的本地时间(例如夏令时结束,或因时区规则变更而减小时区偏移),或者表示在正向时区转换时被跳过的本地时间(例如夏令时开始,或因时区规则变更而增大时区偏移)时,使用转换之前的时区偏移来解释 t 。如果 possibleInstants 非空,则令 disambiguatedInstant 为 possibleInstants [0]。 否则,注 :t 表示在正向时区转换时被跳过的本地时间(例如因夏令时开始或时区规则变更增大 UTC 偏移)。令 possibleInstantsBefore 为 GetNamedTimeZoneEpochNanoseconds (systemTimeZoneIdentifier , YearFromTime (tBefore ), MonthFromTime (tBefore ) + 1, DateFromTime (tBefore ), HourFromTime (tBefore ), MinuteFromTime (tBefore ), SecondFromTime (tBefore ), MillisecondFromTime (tBefore ), 0, 0),其中 tBefore 是满足 possibleInstantsBefore 非空的最大整数 Number < t (即 tBefore 表示转换之前的最后一个本地时间)。 令 disambiguatedInstant 为 possibleInstantsBefore 的最后一个元素。 令 offsetNanoseconds 为 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , disambiguatedInstant )。 令 offsetMilliseconds 为 truncate (offsetNanoseconds / NanosecondsPerMillisecond )。 返回 t - 𝔽 (offsetMilliseconds )。
输入 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。
注 1
要求时区感知 实现(并建议所有其他实现)使用 IANA 时区数据库 中的时区信息。
America/New_York 中 2017 年 11 月 5 日凌晨 1:30 会重复两次(时钟向后调整),但必须将其解释为 UTC-04 的凌晨 1:30,而不是 UTC-05 的凌晨 1:30。
在 UTC(TimeClip (MakeDate (MakeDay (2017, 10, 5), MakeTime (1, 30, 0, 0)))) 中,offsetMilliseconds 的值是 -4 × MillisecondsPerHour 。
America/New_York 中 2017 年 3 月 12 日凌晨 2:30 不存在,但必须将其解释为 UTC-05 的凌晨 2:30(等价于 UTC-04 的凌晨 3:30)。
在 UTC(TimeClip (MakeDate (MakeDay (2017, 2, 12), MakeTime (2, 30, 0, 0)))) 中,offsetMilliseconds 的值是 -5 × MillisecondsPerHour 。
注 2
UTC(LocalTime (t UTC )) 不一定始终等于 t UTC 。相应地,LocalTime (UTC(t local )) 也不一定始终等于 t local 。
21.4.1.27 MakeTime ( hour , minute , second , millisecond )
抽象操作 MakeTime,接收参数 hour (Number)、minute (Number)、second (Number) 和 millisecond (Number);返回值:Number。 它计算毫秒数。 调用时执行以下步骤:
如果 hour 不是有限 Number ,minute 不是有限 Number ,second 不是有限 Number ,或 millisecond 不是有限 Number ,返回 NaN 。 令 hourMV 为 ! ToIntegerOrInfinity (hour )。 令 minuteMV 为 ! ToIntegerOrInfinity (minute )。 令 secondMV 为 ! ToIntegerOrInfinity (second )。 令 millisecondMV 为 ! ToIntegerOrInfinity (millisecond )。 返回 ((𝔽 (hourMV ) × 𝔽 (MillisecondsPerHour ) + 𝔽 (minuteMV ) × 𝔽 (MillisecondsPerMinute )) + 𝔽 (secondMV ) × 𝔽 (MillisecondsPerSecond )) + 𝔽 (millisecondMV )。
注
MakeTime 中的算术是浮点算术,它不满足结合律,因此必须按正确顺序执行运算。
21.4.1.28 MakeDay ( year , month , day )
抽象操作 MakeDay,接收参数 year (Number)、month (Number) 和 day (Number);返回值:(a finite Number 或 NaN )。 它计算天数。 调用时执行以下步骤:
如果 year 不是有限 Number ,month 不是有限 Number ,或 day 不是有限 Number ,返回 NaN 。 令 yearMV 为 ! ToIntegerOrInfinity (year )。 令 monthMV 为 ! ToIntegerOrInfinity (month )。 令 dayMV 为 ! ToIntegerOrInfinity (day )。 令 balancedYear 为 𝔽 (yearMV ) + 𝔽 (floor (monthMV / 12))。 如果 balancedYear 不是有限 Number ,返回 NaN 。 令 balancedMonthMV 为 monthMV modulo 12。 找到一个有限时间值 tv ,使得 YearFromTime (tv ) = ℝ (balancedYear )、MonthFromTime (tv ) = balancedMonthMV 且 DateFromTime (tv ) = 1;但如果无法做到这一点(因为某个实参超出范围),返回 NaN 。 返回 𝔽 (Day (tv )) + 𝔽 (dayMV ) - 1 𝔽 。
21.4.1.29 MakeDate ( day , time )
抽象操作 MakeDate,接收参数 day (Number) 和 time (Number);返回值:(a finite Number 或 NaN )。 它计算毫秒数。 调用时执行以下步骤:
如果 day 不是有限 Number 或 time 不是有限 Number ,返回 NaN 。 令 tv 为 day × 𝔽 (MillisecondsPerDay ) + time 。 如果 tv 不是有限 Number ,返回 NaN 。 返回 tv 。
21.4.1.30 MakeFullYear ( year )
抽象操作 MakeFullYear,接收参数 year (Number);返回值:(整数 Number 或 NaN )。 它返回与 year 整数 部分关联的完整年份,并将从 0 到 99 的闭区间 内的任何值解释为自 1900 年开始以来经过的年数。为了与外推格里高利历对齐,“完整年份”定义为自年份 0(公元前 1 年)开始以来完整年份的带符号计数。 调用时执行以下步骤:
如果 year 是 NaN 、+∞ 𝔽 或 -∞ 𝔽 之一,则返回 NaN 。 令 truncated 为 ! ToIntegerOrInfinity (year )。 如果 truncated 位于从 0 到 99 的闭区间 内,则返回 1900 𝔽 + 𝔽 (truncated )。 返回 𝔽 (truncated )。
21.4.1.31 TimeClip ( time )
抽象操作 TimeClip,接收参数 time (Number);返回值:a time value。 它计算毫秒数。 调用时执行以下步骤:
如果 time 不是有限 Number ,返回 NaN 。 如果 abs (ℝ (time )) > 8.64 × 1015 ,返回 NaN 。 返回 𝔽 (! ToIntegerOrInfinity (time ))。
21.4.1.32 日期时间字符串格式
ECMAScript 定义了一种日期时间字符串交换格式,它改编自 ISO 8601 日历日期扩展格式。其格式如下:YYYY-MM-DDTHH:mm:ss.sssZ
其中各元素如下:
YYYY
是外推格里高利历中的年份,表示为从 0000 到 9999 的四位十进制数字,或者表示为扩展年份 ,即 "+" 或 "-" 后跟六位十进制数字。
-
"-" (连字符)在字符串中字面出现两次。
MM
是一年中的月份,以两位十进制数字表示,从 01(一月)到 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
它还包括“日期时间”形式,由上述某一种仅日期形式紧接以下某一种时间形式组成,并可在末尾附加可选的 UTC 偏移表示:
THH:mm
THH:mm:ss
THH:mm:ss.sss
包含 越界或不符合要求元素的字符串不是此格式的有效实例。
注 1
由于每一天都以午夜开始并以午夜结束,因此可以使用 00:00 和 24:00 两种表示法来区分可与同一个日期关联的两个午夜。这意味着以下两种表示法指向完全相同的时间点:1995-02-04T24:00 和 1995-02-05T00:00。
注 2
此格式不支持 RFC 9557 中定义的带时区名称注 解,仅支持时区偏移的数字表示。
21.4.1.32.1 扩展年份
为了覆盖 相对于 1970 年 1 月 1 日向前或向后约 273,790 年的完整时间值 范围(21.4.1.1 ),需要表示 0 年之前或 9999 年之后的年份。ISO 8601 允许扩展年份表示,但仅限信息交换双方共同约定的情况下。在简化的 ECMAScript 格式中,此类扩展年份 表示应具有 6 位数字,并且始终以 + 或 - 符号作为前缀。年份 0 被视为正数,必须以 + 符号作为前缀。将年份 0 表示为 -000000 是无效的。与日期时间字符串格式 匹配、但其扩展年份所表示的时间瞬间超出时间值 范围的字符串,会被 Date.parse 视为不可识别,并使该函数返回 NaN ,而不会回退到实现特定的行为或启发式处理。
注
具有扩展年份的日期时间值 示例:
-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 定义了一种派生自 ISO 8601 的 UTC 偏移字符串交换格式。
该格式由以下文法描述。
语法
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
TemporalDecimalFraction opt
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 )
抽象操作 IsTimeZoneOffsetString,接收参数 offsetString (String);返回值:Boolean。 返回值表示 offsetString 是否符合 UTCOffset 给出的文法。 调用时执行以下步骤:
令 parseResult 为 ParseText (offsetString , UTCOffset )。 如果 parseResult 是错误的 List ,则返回 false 。 返回 true 。
21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )
抽象操作 ParseTimeZoneOffsetString,接收参数 offsetString (String);返回值:整数 。 返回值是与 String offsetString 对应的 UTC 偏移,以纳秒数表示。 调用时执行以下步骤:
令 parseResult 为 ParseText (offsetString , UTCOffset )。 断言 :parseResult 不是错误的 List 。断言 :parseResult 包含 ASCIISign Parse Node。令 parsedSign 为 parseResult 中包含 的 ASCIISign Parse Node 所匹配的源文本 。 如果 parsedSign 是单个码点 U+002D (HYPHEN-MINUS),则令 sign 为 -1。 否则,令 sign 为 1。 注 :下面对 StringToNumber 的应用不会丢失精度,因为每个解析值都保证是足够短的十进制数字字符串。断言 :parseResult 包含 Hour Parse Node。令 parsedHours 为 parseResult 中包含 的 Hour Parse Node 所匹配的源文本 。 令 hours 为 ℝ (StringToNumber (CodePointsToString (parsedHours )))。 如果 parseResult 不包含 MinuteSecond Parse Node,则令 minutes 为 0。 否则,令 parsedMinutes 为 parseResult 中包含 的第一个 MinuteSecond Parse Node 所匹配的源文本 。 令 minutes 为 ℝ (StringToNumber (CodePointsToString (parsedMinutes )))。 如果 parseResult 不包含 两个 MinuteSecond Parse Node,则令 seconds 为 0。 否则,令 parsedSeconds 为 parseResult 中包含 的第二个 MinuteSecond Parse Node 所匹配的源文本 。 令 seconds 为 ℝ (StringToNumber (CodePointsToString (parsedSeconds )))。 如果 parseResult 不包含 TemporalDecimalFraction Parse Node,则令 nanoseconds 为 0。 否则,令 parsedFraction 为 parseResult 中包含 的 TemporalDecimalFraction Parse Node 所匹配的源文本 。 令 fraction 为 CodePointsToString (parsedFraction ) 和 "000000000" 的字符串连接 。 令 nanosecondsString 为 fraction 从 1 到 10 的子字符串 。 令 nanoseconds 为 ℝ (StringToNumber (nanosecondsString ))。 返回 sign × (((hours × MinutesPerHour + minutes ) × SecondsPerMinute + seconds ) × NanosecondsPerSecond + nanoseconds )。
21.4.4 Date 原型对象的属性
Date 原型对象 :
除非另有明确规定,下面定义的 Date 原型对象的方法不是通用方法,传递给它们的 this value 必须是具有已初始化为时间值 的 [[DateValue]] 内部槽的对象。
21.4.4.1 Date.prototype.constructor
Date.prototype.constructor 的初始值是 %Date% 。
21.4.4.2 Date.prototype.getDate ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (DateFromTime (LocalTime (tv )))。
21.4.4.3 Date.prototype.getDay ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (WeekDay (LocalTime (tv )))。
21.4.4.4 Date.prototype.getFullYear ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (YearFromTime (LocalTime (tv )))。
21.4.4.5 Date.prototype.getHours ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (HourFromTime (LocalTime (tv )))。
21.4.4.6 Date.prototype.getMilliseconds ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (MillisecondFromTime (LocalTime (tv )))。
21.4.4.7 Date.prototype.getMinutes ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (MinuteFromTime (LocalTime (tv )))。
21.4.4.8 Date.prototype.getMonth ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (MonthFromTime (LocalTime (tv )))。
21.4.4.9 Date.prototype.getSeconds ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (SecondFromTime (LocalTime (tv )))。
21.4.4.10 Date.prototype.getTime ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 返回 dateObj .[[DateValue]] 。
21.4.4.11 Date.prototype.getTimezoneOffset ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 (tv - LocalTime (tv )) / 𝔽 (MillisecondsPerMinute )。
21.4.4.12 Date.prototype.getUTCDate ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (DateFromTime (tv ))。
21.4.4.13 Date.prototype.getUTCDay ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (WeekDay (tv ))。
21.4.4.14 Date.prototype.getUTCFullYear ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (YearFromTime (tv ))。
21.4.4.15 Date.prototype.getUTCHours ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (HourFromTime (tv ))。
21.4.4.16 Date.prototype.getUTCMilliseconds ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (MillisecondFromTime (tv ))。
21.4.4.17 Date.prototype.getUTCMinutes ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (MinuteFromTime (tv ))。
21.4.4.18 Date.prototype.getUTCMonth ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (MonthFromTime (tv ))。
21.4.4.19 Date.prototype.getUTCSeconds ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 NaN 。 返回 𝔽 (SecondFromTime (tv ))。
21.4.4.20 Date.prototype.setDate ( day )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 dayNumber 为 ? ToNumber (day )。 如果 tv 是 NaN ,则返回 NaN 。 将 tv 设置为 LocalTime (tv )。 令 newDate 为 MakeDate (MakeDay (𝔽 (YearFromTime (tv )), 𝔽 (MonthFromTime (tv )), dayNumber ), 𝔽 (TimeWithinDay (tv )))。 令 u 为 TimeClip (UTC (newDate ))。 将 dateObj .[[DateValue]] 设置为 u 。 返回 u 。
21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , day ] ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 yearNumber 为 ? ToNumber (year )。 如果 tv 是 NaN ,则将 tv 设置为 +0 𝔽 ;否则将 tv 设置为 LocalTime (tv )。 如果存在 month ,则令 monthNumber 为 ? ToNumber (month );否则令 monthNumber 为 𝔽 (MonthFromTime (tv ))。 如果存在 day ,则令 dayNumber 为 ? ToNumber (day );否则令 dayNumber 为 𝔽 (DateFromTime (tv ))。 令 newDate 为 MakeDate (MakeDay (yearNumber , monthNumber , dayNumber ), 𝔽 (TimeWithinDay (tv )))。 令 u 为 TimeClip (UTC (newDate ))。 将 dateObj .[[DateValue]] 设置为 u 。 返回 u 。
此方法的 "length" 属性是 3 𝔽 。
注
如果不存在 month ,则此方法的行为如同 month 存在且值为 getMonth()。如果不存在 day ,则其行为如同 day 存在且值为 getDate()。
21.4.4.22 Date.prototype.setHours ( hour [ , minute [ , second [ , millisecond ] ] ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 hourNumber 为 ? ToNumber (hour )。 如果存在 minute ,则令 minuteNumber 为 ? ToNumber (minute )。 如果存在 second ,则令 secondNumber 为 ? ToNumber (second )。 如果存在 millisecond ,则令 millisecondNumber 为 ? ToNumber (millisecond )。 如果 tv 是 NaN ,则返回 NaN 。 将 tv 设置为 LocalTime (tv )。 如果不存在 minute ,则令 minuteNumber 为 𝔽 (MinuteFromTime (tv ))。 如果不存在 second ,则令 secondNumber 为 𝔽 (SecondFromTime (tv ))。 如果不存在 millisecond ,则令 millisecondNumber 为 𝔽 (MillisecondFromTime (tv ))。 令 date 为 MakeDate (𝔽 (Day (tv )), MakeTime (hourNumber , minuteNumber , secondNumber , millisecondNumber ))。 令 u 为 TimeClip (UTC (date ))。 将 dateObj .[[DateValue]] 设置为 u 。 返回 u 。
此方法的 "length" 属性是 4 𝔽 。
注
如果不存在 minute ,则此方法的行为如同 minute 存在且值为 getMinutes()。如果不存在 second ,则其行为如同 second 存在且值为 getSeconds()。如果不存在 millisecond ,则其行为如同 millisecond 存在且值为 getMilliseconds()。
21.4.4.23 Date.prototype.setMilliseconds ( millisecond )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 millisecondNumber 为 ? ToNumber (millisecond )。 如果 tv 是 NaN ,则返回 NaN 。 将 tv 设置为 LocalTime (tv )。 令 time 为 MakeTime (𝔽 (HourFromTime (tv )), 𝔽 (MinuteFromTime (tv )), 𝔽 (SecondFromTime (tv )), millisecondNumber )。 令 u 为 TimeClip (UTC (MakeDate (𝔽 (Day (tv )), time )))。 将 dateObj .[[DateValue]] 设置为 u 。 返回 u 。
21.4.4.24 Date.prototype.setMinutes ( minute [ , second [ , millisecond ] ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 minuteNumber 为 ? ToNumber (minute )。 如果存在 second ,则令 secondNumber 为 ? ToNumber (second )。 如果存在 millisecond ,则令 millisecondNumber 为 ? ToNumber (millisecond )。 如果 tv 是 NaN ,则返回 NaN 。 将 tv 设置为 LocalTime (tv )。 如果不存在 second ,则令 secondNumber 为 𝔽 (SecondFromTime (tv ))。 如果不存在 millisecond ,则令 millisecondNumber 为 𝔽 (MillisecondFromTime (tv ))。 令 date 为 MakeDate (𝔽 (Day (tv )), MakeTime (𝔽 (HourFromTime (tv )), minuteNumber , secondNumber , millisecondNumber ))。 令 u 为 TimeClip (UTC (date ))。 将 dateObj .[[DateValue]] 设置为 u 。 返回 u 。
此方法的 "length" 属性是 3 𝔽 。
注
如果不存在 second ,则此方法的行为如同 second 存在且值为 getSeconds()。如果不存在 millisecond ,则其行为如同 millisecond 存在且值为 getMilliseconds()。
21.4.4.25 Date.prototype.setMonth ( month [ , day ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 monthNumber 为 ? ToNumber (month )。 如果存在 day ,则令 dayNumber 为 ? ToNumber (day )。 如果 tv 是 NaN ,则返回 NaN 。 将 tv 设置为 LocalTime (tv )。 如果不存在 day ,则令 dayNumber 为 𝔽 (DateFromTime (tv ))。 令 newDate 为 MakeDate (MakeDay (𝔽 (YearFromTime (tv )), monthNumber , dayNumber ), 𝔽 (TimeWithinDay (tv )))。 令 u 为 TimeClip (UTC (newDate ))。 将 dateObj .[[DateValue]] 设置为 u 。 返回 u 。
此方法的 "length" 属性是 2 𝔽 。
注
如果不存在 day ,则此方法的行为如同 day 存在且值为 getDate()。
21.4.4.26 Date.prototype.setSeconds ( second [ , millisecond ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 secondNumber 为 ? ToNumber (second )。 如果存在 millisecond ,则令 millisecondNumber 为 ? ToNumber (millisecond )。 如果 tv 是 NaN ,则返回 NaN 。 将 tv 设置为 LocalTime (tv )。 如果不存在 millisecond ,则令 millisecondNumber 为 𝔽 (MillisecondFromTime (tv ))。 令 date 为 MakeDate (𝔽 (Day (tv )), MakeTime (𝔽 (HourFromTime (tv )), 𝔽 (MinuteFromTime (tv )), secondNumber , millisecondNumber ))。 令 u 为 TimeClip (UTC (date ))。 将 dateObj .[[DateValue]] 设置为 u 。 返回 u 。
此方法的 "length" 属性是 2 𝔽 。
注
如果不存在 millisecond ,则此方法的行为如同 millisecond 存在且值为 getMilliseconds()。
21.4.4.27 Date.prototype.setTime ( time )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 t 为 ? ToNumber (time )。 令 v 为 TimeClip (t )。 将 dateObj .[[DateValue]] 设置为 v 。 返回 v 。
21.4.4.28 Date.prototype.setUTCDate ( day )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 dayNumber 为 ? ToNumber (day )。 如果 tv 是 NaN ,则返回 NaN 。 令 newDate 为 MakeDate (MakeDay (𝔽 (YearFromTime (tv )), 𝔽 (MonthFromTime (tv )), dayNumber ), 𝔽 (TimeWithinDay (tv )))。 令 v 为 TimeClip (newDate )。 将 dateObj .[[DateValue]] 设置为 v 。 返回 v 。
21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , day ] ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则将 tv 设置为 +0 𝔽 。 令 yearNumber 为 ? ToNumber (year )。 如果存在 month ,则令 monthNumber 为 ? ToNumber (month );否则令 monthNumber 为 𝔽 (MonthFromTime (tv ))。 如果存在 day ,则令 dayNumber 为 ? ToNumber (day );否则令 dayNumber 为 𝔽 (DateFromTime (tv ))。 令 newDate 为 MakeDate (MakeDay (yearNumber , monthNumber , dayNumber ), 𝔽 (TimeWithinDay (tv )))。 令 v 为 TimeClip (newDate )。 将 dateObj .[[DateValue]] 设置为 v 。 返回 v 。
此方法的 "length" 属性是 3 𝔽 。
注
如果不存在 month ,则此方法的行为如同 month 存在且值为 getUTCMonth()。如果不存在 day ,则其行为如同 day 存在且值为 getUTCDate()。
21.4.4.30 Date.prototype.setUTCHours ( hour [ , minute [ , second [ , millisecond ] ] ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 hourNumber 为 ? ToNumber (hour )。 如果存在 minute ,则令 minuteNumber 为 ? ToNumber (minute )。 如果存在 second ,则令 secondNumber 为 ? ToNumber (second )。 如果存在 millisecond ,则令 millisecondNumber 为 ? ToNumber (millisecond )。 如果 tv 是 NaN ,则返回 NaN 。 如果不存在 minute ,则令 minuteNumber 为 𝔽 (MinuteFromTime (tv ))。 如果不存在 second ,则令 secondNumber 为 𝔽 (SecondFromTime (tv ))。 如果不存在 millisecond ,则令 millisecondNumber 为 𝔽 (MillisecondFromTime (tv ))。 令 date 为 MakeDate (𝔽 (Day (tv )), MakeTime (hourNumber , minuteNumber , secondNumber , millisecondNumber ))。 令 v 为 TimeClip (date )。 将 dateObj .[[DateValue]] 设置为 v 。 返回 v 。
此方法的 "length" 属性是 4 𝔽 。
注
如果不存在 minute ,则此方法的行为如同 minute 存在且值为 getUTCMinutes()。如果不存在 second ,则其行为如同 second 存在且值为 getUTCSeconds()。如果不存在 millisecond ,则其行为如同 millisecond 存在且值为 getUTCMilliseconds()。
21.4.4.31 Date.prototype.setUTCMilliseconds ( millisecond )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 millisecondNumber 为 ? ToNumber (millisecond )。 如果 tv 是 NaN ,则返回 NaN 。 令 time 为 MakeTime (𝔽 (HourFromTime (tv )), 𝔽 (MinuteFromTime (tv )), 𝔽 (SecondFromTime (tv )), millisecondNumber )。 令 v 为 TimeClip (MakeDate (𝔽 (Day (tv )), time ))。 将 dateObj .[[DateValue]] 设置为 v 。 返回 v 。
21.4.4.32 Date.prototype.setUTCMinutes ( minute [ , second [ , millisecond ] ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 minuteNumber 为 ? ToNumber (minute )。 如果存在 second ,则令 secondNumber 为 ? ToNumber (second )。 如果存在 millisecond ,则令 millisecondNumber 为 ? ToNumber (millisecond )。 如果 tv 是 NaN ,则返回 NaN 。 如果不存在 second ,则令 secondNumber 为 𝔽 (SecondFromTime (tv ))。 如果不存在 millisecond ,则令 millisecondNumber 为 𝔽 (MillisecondFromTime (tv ))。 令 date 为 MakeDate (𝔽 (Day (tv )), MakeTime (𝔽 (HourFromTime (tv )), minuteNumber , secondNumber , millisecondNumber ))。 令 v 为 TimeClip (date )。 将 dateObj .[[DateValue]] 设置为 v 。 返回 v 。
此方法的 "length" 属性是 3 𝔽 。
注
如果不存在 second ,则此方法的行为如同 second 存在且值为 getUTCSeconds()。如果不存在 millisecond ,则其行为如同 millisecond 存在且值为 getUTCMilliseconds() 的返回值。
21.4.4.33 Date.prototype.setUTCMonth ( month [ , day ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 monthNumber 为 ? ToNumber (month )。 如果存在 day ,则令 dayNumber 为 ? ToNumber (day )。 如果 tv 是 NaN ,则返回 NaN 。 如果不存在 day ,则令 dayNumber 为 𝔽 (DateFromTime (tv ))。 令 newDate 为 MakeDate (MakeDay (𝔽 (YearFromTime (tv )), monthNumber , dayNumber ), 𝔽 (TimeWithinDay (tv )))。 令 v 为 TimeClip (newDate )。 将 dateObj .[[DateValue]] 设置为 v 。 返回 v 。
此方法的 "length" 属性是 2 𝔽 。
注
如果不存在 day ,则此方法的行为如同 day 存在且值为 getUTCDate()。
21.4.4.34 Date.prototype.setUTCSeconds ( second [ , millisecond ] )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 令 secondNumber 为 ? ToNumber (second )。 如果存在 millisecond ,则令 millisecondNumber 为 ? ToNumber (millisecond )。 如果 tv 是 NaN ,则返回 NaN 。 如果不存在 millisecond ,则令 millisecondNumber 为 𝔽 (MillisecondFromTime (tv ))。 令 date 为 MakeDate (𝔽 (Day (tv )), MakeTime (𝔽 (HourFromTime (tv )), 𝔽 (MinuteFromTime (tv )), secondNumber , millisecondNumber ))。 令 v 为 TimeClip (date )。 将 dateObj .[[DateValue]] 设置为 v 。 返回 v 。
此方法的 "length" 属性是 2 𝔽 。
注
如果不存在 millisecond ,则此方法的行为如同 millisecond 存在且值为 getUTCMilliseconds()。
21.4.4.35 Date.prototype.toDateString ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 "Invalid Date" 。 令 t 为 LocalTime (tv )。 返回 DateString (t )。
21.4.4.36 Date.prototype.toISOString ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则抛出 RangeError 异常。 断言 :tv 是整数 Number 。如果 tv 对应于无法在日期时间字符串格式 中表示的年份,则抛出 RangeError 异常。 返回 tv 在 UTC 时间尺度上采用日期时间字符串格式 的 String 表示,包括所有格式元素以及 UTC 偏移表示 "Z" 。
21.4.4.37 Date.prototype.toJSON ( key )
此方法提供用于 JSON.stringify(25.5.4 )的 Date 的 String 表示。
调用时,它执行以下步骤:
令 obj 为 ? ToObject (this value)。 令 tv 为 ? ToPrimitive (obj , number )。 如果 tv 是 Number 且 tv 不是有限 Number ,返回 null 。 返回 ? Invoke (obj , "toISOString" )。
注 1
注 2
此方法有意设计为通用方法;它不要求其 this value 是 Date。因此,它可以被转移到其他种类的对象上用作方法。不过,它要求任何此类对象都具有 toISOString 方法。
21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )
包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按照 ECMA-402 的规定实现此方法。否则,使用以下此方法的规范:
此方法返回一个 String 值。该 String 的内容由实现定义 ,但旨在以方便、人类可读且符合宿主环境 当前区域设置惯例的形式,表示当前时区中 Date 的“日期”部分。
此方法可选参数的含义定义于 ECMA-402;不包含 ECMA-402 支持的实现不得将这些参数位置用于其他用途。
21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按照 ECMA-402 的规定实现此方法。否则,使用以下此方法的规范:
此方法返回一个 String 值。该 String 的内容由实现定义 ,但旨在以方便、人类可读且符合宿主环境 当前区域设置惯例的形式,表示当前时区中的 Date。
此方法可选参数的含义定义于 ECMA-402;不包含 ECMA-402 支持的实现不得将这些参数位置用于其他用途。
21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )
包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按照 ECMA-402 的规定实现此方法。否则,使用以下此方法的规范:
此方法返回一个 String 值。该 String 的内容由实现定义 ,但旨在以方便、人类可读且符合宿主环境 当前区域设置惯例的形式,表示当前时区中 Date 的“时间”部分。
此方法可选参数的含义定义于 ECMA-402;不包含 ECMA-402 支持的实现不得将这些参数位置用于其他用途。
21.4.4.41 Date.prototype.toString ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 返回 ToDateString (tv )。
注 1
对于任何满足 d.[[DateValue]] 能被 1000 整除的 Date d,Date.parse(d.toString()) 的结果 = d.valueOf()。参见 21.4.3.2 。
注 2
此方法不是通用方法;如果其 this value 不是 Date,则会抛出 TypeError 异常。因此,它不能被转移到其他种类的对象上用作方法。
21.4.4.41.1 TimeString ( tv )
抽象操作 TimeString,接收参数 tv (a Number, but not NaN );返回值:String。 调用时执行以下步骤:
令 hour 为 ToZeroPaddedDecimalString (HourFromTime (tv ), 2)。 令 minute 为 ToZeroPaddedDecimalString (MinuteFromTime (tv ), 2)。 令 second 为 ToZeroPaddedDecimalString (SecondFromTime (tv ), 2)。 返回 hour 、":" 、minute 、":" 、second 、码元 0x0020 (SPACE) 和 "GMT" 的字符串连接 。
21.4.4.41.2 DateString ( tv )
抽象操作 DateString,接收参数 tv (a Number, but not NaN );返回值:String。 调用时执行以下步骤:
令 weekday 为 表 61 中 WeekDay Index = WeekDay (tv ) 的条目的 Name。 令 month 为 表 62 中 Month Index = MonthFromTime (tv ) 的条目的 Name。 令 day 为 ToZeroPaddedDecimalString (DateFromTime (tv ), 2)。 令 yv 为 YearFromTime (tv )。 如果 yv ≥ 0,则令 yearSign 为空 String;否则令 yearSign 为 "-" 。 令 paddedYear 为 ToZeroPaddedDecimalString (abs (yv ), 4)。 返回 weekday 、码元 0x0020 (SPACE)、month 、码元 0x0020 (SPACE)、day 、码元 0x0020 (SPACE)、yearSign 和 paddedYear 的字符串连接 。
表 61: 一周各日的名称
WeekDay 索引
名称
0
"Sun"
1
"Mon"
2
"Tue"
3
"Wed"
4
"Thu"
5
"Fri"
6
"Sat"
表 62: 一年各月的名称
Month 索引
名称
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 )
抽象操作 TimeZoneString,接收参数 tv (整数 Number );返回值:String。 调用时执行以下步骤:
令 systemTimeZoneIdentifier 为 SystemTimeZoneIdentifier ()。 如果 IsTimeZoneOffsetString (systemTimeZoneIdentifier ) 是 true ,则令 offsetNanoseconds 为 ParseTimeZoneOffsetString (systemTimeZoneIdentifier )。 否则,令 offsetNanoseconds 为 GetNamedTimeZoneOffsetNanoseconds (systemTimeZoneIdentifier , ℝ (tv ) × NanosecondsPerMillisecond )。 令 offsetMilliseconds 为 truncate (offsetNanoseconds / NanosecondsPerMillisecond )。 如果 offsetMilliseconds ≥ 0,则令 offsetSign 为 "+" 。 令 absOffsetMilliseconds 为 offsetMilliseconds 。 否则,令 offsetSign 为 "-" 。 令 absOffsetMilliseconds 为 -offsetMilliseconds 。 令 offsetMinute 为 ToZeroPaddedDecimalString (MinuteFromTime (𝔽 (absOffsetMilliseconds )), 2)。 令 offsetHour 为 ToZeroPaddedDecimalString (HourFromTime (𝔽 (absOffsetMilliseconds )), 2)。 令 timeZoneName 为实现定义 的字符串,它要么是空 String,要么是码元 0x0020 (SPACE)、码元 0x0028 (LEFT PARENTHESIS)、实现定义 的时区名称和码元 0x0029 (RIGHT PARENTHESIS) 的字符串连接 。 返回 offsetSign 、offsetHour 、offsetMinute 和 timeZoneName 的字符串连接 。
21.4.4.41.4 ToDateString ( tv )
抽象操作 ToDateString,接收参数 tv ((整数 Number 或 NaN ));返回值:String。 调用时执行以下步骤:
如果 tv 是 NaN ,则返回 "Invalid Date" 。 令 localTime 为 LocalTime (tv )。 返回 DateString (localTime )、码元 0x0020 (SPACE)、TimeString (localTime ) 和 TimeZoneString (tv ) 的字符串连接 。
21.4.4.42 Date.prototype.toTimeString ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 "Invalid Date" 。 令 localTime 为 LocalTime (tv )。 返回 TimeString (localTime ) 和 TimeZoneString (tv ) 的字符串连接 。
21.4.4.43 Date.prototype.toUTCString ( )
此方法返回表示与 this value 对应的时间瞬间的 String 值。该 String 的格式基于 RFC 7231 中的 HTTP-date,并推广为支持 ECMAScript Date 所支持的完整时间范围。
调用时,它执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 令 tv 为 dateObj .[[DateValue]] 。 如果 tv 是 NaN ,则返回 "Invalid Date" 。 令 weekday 为 表 61 中 WeekDay Index = WeekDay (tv ) 的条目的 Name。 令 month 为 表 62 中 Month Index = MonthFromTime (tv ) 的条目的 Name。 令 day 为 ToZeroPaddedDecimalString (DateFromTime (tv ), 2)。 令 yv 为 YearFromTime (tv )。 如果 yv ≥ 0,则令 yearSign 为空 String;否则令 yearSign 为 "-" 。 令 paddedYear 为 ToZeroPaddedDecimalString (abs (yv ), 4)。 返回 weekday 、"," 、码元 0x0020 (SPACE)、day 、码元 0x0020 (SPACE)、month 、码元 0x0020 (SPACE)、yearSign 、paddedYear 、码元 0x0020 (SPACE) 和 TimeString (tv ) 的字符串连接 。
21.4.4.44 Date.prototype.valueOf ( )
调用时,此方法执行以下步骤:
令 dateObj 为 this value。 执行 ? RequireInternalSlot (dateObj , [[DateValue]] )。 返回 dateObj .[[DateValue]] 。
21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )
ECMAScript 语言运算符会调用此方法,将 Date 转换为原始值。hint 允许的值是 "default" 、"number" 和 "string" 。Date 在内置 ECMAScript 对象中是独特的,因为它们将 "default" 视为等价于 "string" ;所有其他内置 ECMAScript 对象都将 "default" 视为等价于 "number" 。
调用时,它执行以下步骤:
令 obj 为 this value。 如果 obj 不是 Object,则抛出 TypeError 异常。 如果 hint 是 "string" 或 "default" ,则令 tryFirst 为 string 。 否则如果 hint 是 "number" ,则令 tryFirst 为 number 。 否则,抛出 TypeError 异常。 返回 ? OrdinaryToPrimitive (obj , tryFirst )。
此属性具有特性 { [[Writable]] : false , [[Enumerable]] : false , [[Configurable]] : true }。
此方法的 "name" 属性值是 "[Symbol.toPrimitive]" 。