Intl Era and MonthCode Proposal S4
中文标题:Intl 纪元和 MonthCode 提案
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2026
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案为 Temporal 集成中非 ISO 日历的 era、eraYear 和 monthCode 指定了详细行为,旨在填补 ECMA-402 规范中的空白。它定义了抽象操作、有效的 era 代码、月份代码以及针对 gregory、roc、buddhist、japanese 等日历的错误条件。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
Intl 纪元和 monthCode 提案
(旧名称“Intl Temporal 提案”)
为了在国际化设置中(针对“iso8601”以外的日历)指定关于 era、eraYear 和 monthCode 与 Temporal 一起使用的必要细节。
阶段 - 阶段 4
-
该提案在 2026 年 3 月 10 日的 TC39 会议上推进到 ECMA402 的阶段 4。(会议记录在 5 月被 TC39 批准后将添加链接)。
-
该提案在 2026 年 1 月 20 日的 TC39 会议上推进到 ECMA402 的阶段 3。(会议记录在 3 月被 TC39 批准后将添加链接)。
-
该提案在 2025 年 7 月 30 日的 TC39 会议上被推进到 ECMA402 的阶段 2.7
-
该提案在 2023 年 2 月 1 日的 TC39 会议上被推进到 ECMA402 的阶段 2。
-
该提案在 2022 年 12 月 1 日的 TC39 会议上被推进到 ECMA402 的阶段 1。
阶段 3 审阅者
在 2023 年 2 月 1 日的 TC39 会议上,以下成员同意担任本提案的阶段 3 审阅者:
- EAO(Eemeli Aro),来自 Mozilla
- SFC(Shane Carr),来自 Google
演示文稿:
- TC39 2022 年 11 月会议(2022 年 11 月 29 日至 12 月 1 日)的 Intl era 和 monthCode 阶段 1 提案
- TC39 2023 年 1 月会议(2023 年 1 月 23 日至 26 日)的 Intl era 和 monthCode 阶段 2 提案
- TC39 2025 年 7 月会议(2025 年 7 月 28 日至 31 日)的 Intl era 和 monthCode 阶段 2.7 提案
- TC39 2026 年 1 月会议(2026 年 1 月 20 日至 21 日)的 Intl era 和 monthCode 阶段 3 提案
- TC39 2026 年 3 月会议(2026 年 3 月 10 日至 12 日)的 Intl era 和 monthCode 阶段 4 提案
参考资料:
范围
Temporal 提案 是一个 ECMA262 的阶段提案,旨在“提供用于处理日期和时间的标准对象和函数”。Temporal 提案的规范文本明确规定了“iso8601”日历和“UTC”时区的行为,以及定义了除“iso8601”和“UTC”之外的日历和时区的名称和某些基本方面。然而,为了实现目的,还需要额外要求。本提案旨在定义这些细节,这些细节最终应合并到 ECMA402 规范中。
需要在 Temporal 提案中定义的抽象操作
我们认为 Temporal 提案 中定义的以下抽象操作需要在本提案中更详细地定义:
- 15.6.1.3 CalendarDateToISO ( calendar, fields, overflow )
- 需要指定抛出 RangeError 异常的条件
- 15.6.1.4 CalendarDateAddition ( calendar, date, duration, overflow )
- 需要指定抛出 RangeError 异常的条件
- 15.6.1.5 CalendarDateDifference ( calendar, one, two, largestUnit )
- 需要指定抛出 RangeError 异常的条件
- 15.6.1.6 CalendarDateEra ( calendar, date )
- 需要为每个日历定义可能的 era 代码,并指定哪些日历将返回 undefined。
- 15.6.1.7 CalendarDateEraYear ( calendar, date() )
- 需要定义哪些日历将返回 undefined。
- 15.6.1.9 CalendarDateMonth ( calendar, date )
- 需要为某些日历定义月份的含义。
- 15.6.1.10 CalendarDateMonthCode ( calendar, date )
- 需要为每个日历定义有效的 monthCode 集合。
- 15.6.1.20 CalendarDateFields ( calendar, fields )
- 需要定义哪些日历将添加“era”和“eraYear”。
- 15.6.1.21 CalendarDateMergeFields ( calendar, fields, additionalFields )
- 需要定义哪些日历将合并“era”和“eraYear”,以及如何合并“era”和“eraYear”。
我们可能会选择为某些日历指定特定的日历算术,如果它们与“iso8601”日历之间的转换非常简单。例如,对于“gregory”、“roc”、“buddhist”、“japanese”日历,但将其他日历的算术留给含糊的语言描述。
我们不打算为 Temporal 提案的以下部分指定日历算术:
- 15.6.1.8 CalendarDateYear ( calendar, date )
- 15.6.1.11 CalendarDateDay ( calendar, date )
- 15.6.1.12 CalendarDateDayOfWeek ( calendar, date )
- 15.6.1.13 CalendarDateDayOfYear ( calendar, date )
- 15.6.1.14 CalendarDateWeekOfYear ( calendar, date )
- 15.6.1.15 CalendarDateDaysInWeek ( calendar, date )
- 15.6.1.16 CalendarDateDaysInMonth ( calendar, date )
- 15.6.1.17 CalendarDateDaysInYear ( calendar, date )
- 15.6.1.18 CalendarDateMonthsInYear ( calendar, date )
- 15.6.1.19 CalendarDateInLeapYear ( calendar, date )
日历
日历的纪元值
Temporal 提案 中的相关规范文本:
- 15.6.2.6 Temporal.Calendar.prototype.era ( temporalDateLike )
- 15.6.5.2 get Temporal.PlainDate.prototype.era
- 15.6.6.2 get Temporal.PlainDateTime.prototype.era
- 15.6.9.2 get Temporal.PlainYearMonth.prototype.era
- 15.6.10.2 get Temporal.ZonedDateTime.prototype.era
- 15.6.1.3 CalendarDateToISO ( calendar, fields, overflow )
对于日历:
-
'calendar' 列表: CLDR 和 ICU 除 "iso8601" 外还支持以下日历,并且目前不同浏览器的 Intl.DateTimeFormat API 支持这些日历。
- "gregory"
- "roc"(除纪元纪年外,与 "gregory" 相同)
- "buddhist"(除纪元纪年外,与 "gregory" 相同)
- "japanese"(除纪元纪年外,与 "gregory" 相同)
- "persian"
- "coptic"
- "ethiopic"
- "ethiopic-ameta-alem" (除纪元纪年外,与 "ethiopic" 相同)
- "indian"
- "hebrew"
- "chinese"
- "dangi"(参考时区除外,与 "chinese" 相同)
- "islamic"
- "islamic-tbla"
- "islamic-umalqura"
- "islamic-civil"
-
对 era 和 eraYear 的要求:
- 在日历中,era 和 eraYear 的组合需要能够唯一标识时间线上的特定年份。
- era 需要是字符串(根据 Temporal 中的 15.6.1.1 CalendarEra)。
- eraYear 需要是整数(根据 Temporal 中的 15.6.1.2 CalendarEraYear)。
- 如果日历中只有一个纪元,我们不需要也不应该在该日历中使用 era/eraYear(例如 "hebrew"、"persian")。
- 如果我们定义 era,我们也需要定义当字段缺失时的行为。(回退到使用 year,或回退到默认值以及默认值是什么)
-
'gregory':待定
日历的纪元年份值
Temporal 提案 中的相关规范文本:
- 15.6.2.7 Temporal.Calendar.prototype.eraYear ( temporalDateLike )
- 15.6.5.3 get Temporal.PlainDate.prototype.eraYear
- 15.6.6.3 get Temporal.PlainDateTime.prototype.eraYear
- 15.6.9.3 get Temporal.PlainYearMonth.prototype.eraYear
- 15.6.10.3 get Temporal.ZonedDateTime.prototype.eraYear
- 15.6.1.3 CalendarDateToISO ( calendar, fields, overflow )
对于日历:
- 'gregory':待定
日历的月份值
Temporal 提案 中的相关规范文本: *
对于日历:
- 'gregory':待定
日历的 MonthCode 值
Temporal 提案 中的相关规范文本: *
对于日历:
- 'gregory':待定