For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/proposal-intl-eradisplay.md.
  • 简体中文
  • eraDisplay option for Intl.DateTimeFormat S1

    中文标题:Intl.DateTimeFormat 的 eraDisplay 选项

    提案概览
    提案速览

    该提案解决了 Intl.DateTimeFormat 中 era 组件显示控制缺失的问题,这可能导致公元前的日期产生歧义。它引入了 eraDisplay 选项,取值 "never"、"always" 和 "auto"(默认),根据上下文控制 era 的显示。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    Intl.DateTimeFormat 的 eraDisplay 选项

    本仓库是基于 ECMAScript 提案的仓库模板构建的。

    规范文本预览:https://tc39.es/proposal-intl-eradisplay/spec

    状态

    概述/动机

    当前(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 中,对于 gregoryiso8601 日历,如果 era 未定义,日期数字组件之间的分隔符("/" 或 ".")会省略。对于非数字月份,没有区别。 另一方面,对于大多数日历(除了 chinese、dangi、gregory 和 iso8601),如果请求了 year,无论 era 选项如何,都会显示 era;对于这些日历,日期数字组件之间用 "/" 或 "." 分隔,具体取决于区域设置,即使显示了 era。 似乎没有理由在添加 era 时省略数字日期组件之间的分隔符。 我不记得见过任何包含数字日、月、年和 era 指示但没有分隔符的日期字符串。

    对所有日历使用相同的规则减少了区域设置中与日历相关的信息量,并简化了作者的选择。 这就是为什么我建议使用总是将 era 组件与年份显示关联的模式。 默认的 eraDisplay 选项应在不需要时跳过该 era 组件。

    我们可以修改提案,以类似于 "pattern12" 的方式设置一个新模式 "patternwoe"(不带 era 的模式)。 Intl.DateTimeFormat 的格式化方法将不得不为每个显示的日期重新计算模式, 而这里我们建议使用相同的模式,只是在某些情况下丢弃一个组件。