eraDisplay option for Intl.DateTimeFormat S1
中文标题:Intl.DateTimeFormat 的 eraDisplay 选项
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案解决了 Intl.DateTimeFormat 中 era 组件显示控制缺失的问题,这可能导致公元前的日期产生歧义。它引入了 eraDisplay 选项,取值 "never"、"always" 和 "auto"(默认),根据上下文控制 era 的显示。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
Intl.DateTimeFormat 的 eraDisplay 选项
本仓库是基于 ECMAScript 提案的仓库模板构建的。
规范文本预览:https://tc39.es/proposal-intl-eradisplay/spec
状态
-
负责人:Shane Carr (@sffc)
-
作者:Louis-Aimé de Fouquières (@Louis-Aime),法国米雷特
-
阶段:2
-
2021-01 TC39 会议中推进至阶段 1:https://github.com/tc39/notes/blob/main/meetings/2021-01/jan-27.md#eradisplay-for-stage-1
-
2022-11 TC39 会议中推进至阶段 2:https://github.com/tc39/notes/blob/main/meetings/2022-11/nov-29.md#eradisplay-option-for-intldatetimeformat
概述/动机
当前(2020年11月)浏览器中 ICU 和 CLDR 的实现,使用 Intl.DateTimeFormat 的开发者无法控制日期的 era 部分是否显示。
另一方面,当显示一个简单的 gregory 日期早于 0000-01-01,且不带选项或使用 dateStyle 时,era 字段不显示,日期具有歧义。
提议的 eraDisplay 选项可以有 3 个值:"never"、"always"、"auto"。如果未定义,则默认为 "auto"。
- "never":无论
era选项如何,era 部分都不显示。 - "always":无论其他选项如何,era 部分都会根据
era的值显示。如果era未定义,则解析为 "short"。 - "auto",默认值:如果年份部分显示,且日期的 era 与今天的日期(在解析的日历中)不同,则显示 era 部分。
演示文稿可在此查看:eraDisplay 演示。
index 文件展示了提议的对 DateTimeFormat 对象规范的修改。
使用场景
您可以在提案的网页上使用模拟。
大多数用户无需更改传递给 Intl.DateTimeFormat 的选项即可获得更好的结果。
new Intl.DateTimeFormat("fr-FR").format(new Date(-752,3,13)) //> "13/4/753"在当前(2020年11月)实现中; 使用此提案://>"13/4/753 BC",即早 1500 年。new Intl.DateTimeFormat("en-US",{calendar : "ethiopic"}).format(new Date()) //> "3/15/2013 ERA1"。 作者没有要求 era 名称,而 CLDR 中缺少该名称。//> "3/15/2013"使用提议的功能并将选项设置为默认值。
有更高要求的用户,如果希望即使与今天相同也显示 era,或者因为读者能从上下文理解而不希望显示,将使用非默认值。
描述
- 作者可以在调用
new Intl.DateTimeFormat()时在选项列表中添加eraDisplay选项。 - 如果在 DateTimeFormat 对象初始化时
eraDisplay选项未定义,则视为 "auto"。 - 初始化 Intl.DateTimeFormat 对象时:
- 如果在解析格式组件选项集后,[[Year]] 槽未定义,则 [[EraDisplay]] 槽的 "auto" 值解析为 "never"。
- 如果 [[EraDisplay]] 不是 "never" 且 [[Era]] 未定义,则 [[Era]] 设置为 "short"。
- 当使用已初始化的 Intl.DateTimeFormat 对象和日期创建日期字符串的各个部分时,[[era]] 部分在以下情况下被跳过:
- 如果 [[EraDisplay]] 为 "never"
- 或者如果 [[EraDisplay]] 为 "auto" 且日期的 era 与使用 Intl.DateTimeFormat 对象的 [[calendar]] 今天的日期相同。
比较
据我们所知,没有类似的功能。计算机语言通常只提供日/月/年而不提供 era,且仅使用非常有限的日历(如果不是只有一种)。
实现
模拟
原生实现
后续阶段确定
问答
问:日期模式是否应该根据是否显示 [[Era]] 而有所不同?
答:在当前(2020年11月)版本的 ICU 和 CLDR 中,对于 gregory 和 iso8601 日历,如果 era 未定义,日期数字组件之间的分隔符("/" 或 ".")会省略。对于非数字月份,没有区别。
另一方面,对于大多数日历(除了 chinese、dangi、gregory 和 iso8601),如果请求了 year,无论 era 选项如何,都会显示 era;对于这些日历,日期数字组件之间用 "/" 或 "." 分隔,具体取决于区域设置,即使显示了 era。
似乎没有理由在添加 era 时省略数字日期组件之间的分隔符。
我不记得见过任何包含数字日、月、年和 era 指示但没有分隔符的日期字符串。
对所有日历使用相同的规则减少了区域设置中与日历相关的信息量,并简化了作者的选择。
这就是为什么我建议使用总是将 era 组件与年份显示关联的模式。
默认的 eraDisplay 选项应在不需要时跳过该 era 组件。
我们可以修改提案,以类似于 "pattern12" 的方式设置一个新模式 "patternwoe"(不带 era 的模式)。 Intl.DateTimeFormat 的格式化方法将不得不为每个显示的日期重新计算模式, 而这里我们建议使用相同的模式,只是在某些情况下丢弃一个组件。