|
1 | 1 | <!doctype html>
|
2 | 2 | <head><meta name="viewport" content="width=device-width, initial-scale=1"><meta charset="utf-8"><meta property="og:image" content="https://tc39.es/ecmarkup/ecma-logo.png"><meta property="og:title" content="Intl era and monthCode Proposal"><meta property="og:description" content="Abstract Operations for Temporal.Calendar Objects
|
| 3 | +
|
3 | 4 |
|
4 | 5 |
|
5 | 6 | CalendarSupportsEra (
|
|
13 | 14 |
|
14 | 15 |
|
15 | 16 |
|
16 |
| - 1. If _"> |
17 |
| -<link rel="stylesheet" href="./spec.css"> |
18 |
| -<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/styles/github.min.css"> |
19 |
| -<script src="./spec.js"></script> |
| 17 | + 1. If"> |
20 | 18 | <title>Intl era and monthCode Proposal</title><script>'use strict';
|
21 | 19 | let sdoBox = {
|
22 | 20 | init() {
|
|
3960 | 3958 | </ul></div><div id="menu-toggle"><svg xmlns="http://www.w3.org/2000/svg" style="width:100%; height:100%; stroke:currentColor" viewBox="0 0 120 120" width="54" height="54">
|
3961 | 3959 | <title>Menu</title>
|
3962 | 3960 | <path stroke-width="10" stroke-linecap="round" d="M30,60 h60 M30,30 m0,5 h60 M30,90 m0,-5 h60"></path>
|
3963 |
| - </svg></div><div id="menu-spacer" class="menu-spacer"></div><div id="menu"><div id="menu-search"><input type="text" id="menu-search-box" placeholder="Search..."><div id="menu-search-results" class="inactive"></div></div><div id="menu-pins"><div class="menu-pane-header">Pins<button class="unpin-all">clear</button></div><ul id="menu-pins-list"></ul></div><div class="menu-pane-header">Table of Contents</div><div id="menu-toc"><ol class="toc"><li><span class="item-toggle">+</span><a href="#sup-temporal-calendar-abstract-ops" title="Abstract Operations for Temporal.Calendar Objects"><span class="secnum">1</span> Abstract Operations for Temporal.Calendar Objects</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#sec-temporal-calendarsupportsera" title="CalendarSupportsEra ( calendar )"><span class="secnum">1.1</span> CalendarSupportsEra ( <var>calendar</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sec-temporal-canonicalizeeraincalendar" title="CanonicalizeEraInCalendar ( calendar, era )"><span class="secnum">1.2</span> CanonicalizeEraInCalendar ( <var>calendar</var>, <var>era</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sec-temporal-isvalidmonthecodeforcalendar" title="IsValidMonthCodeForCalendar ( calendar, monthCode )"><span class="secnum">1.3</span> IsValidMonthCodeForCalendar ( <var>calendar</var>, <var>monthCode</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sec-temporal-isvaliderayearforcalendar" title="IsValidEraYearForCalendar ( calendar, era, eraYear )"><span class="secnum">1.4</span> IsValidEraYearForCalendar ( <var>calendar</var>, <var>era</var>, <var>eraYear</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardateera" title="CalendarDateEra ( calendar, date )"><span class="secnum">1.5</span> CalendarDateEra ( <var>calendar</var>, <var>date</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardateerayear" title="CalendarDateEraYear ( calendar, date )"><span class="secnum">1.6</span> CalendarDateEraYear ( <var>calendar</var>, <var>date</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardatearithmeticyear" title="CalendarDateArithmeticYear ( calendar, date )"><span class="secnum">1.7</span> CalendarDateArithmeticYear ( <var>calendar</var>, <var>date</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardatefields" title="CalendarDateFields ( calendar, fields )"><span class="secnum">1.8</span> CalendarDateFields ( <var>calendar</var>, <var>fields</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardatemergefields" title="CalendarDateMergeFields ( calendar, fields, additionalFields )"><span class="secnum">1.9</span> CalendarDateMergeFields ( <var>calendar</var>, <var>fields</var>, <var>additionalFields</var> )</a></li></ol></li><li><span class="item-toggle-none"></span><a href="#sec-copyright-and-software-license" title="Copyright & Software License">Copyright & Software License</a></li></ol></div></div><div id="spec-container"><h1 class="version">Stage 2 Draft / July 3, 2025</h1><h1 class="title">Intl era and monthCode Proposal</h1> |
| 3961 | + </svg></div><div id="menu-spacer" class="menu-spacer"></div><div id="menu"><div id="menu-search"><input type="text" id="menu-search-box" placeholder="Search..."><div id="menu-search-results" class="inactive"></div></div><div id="menu-pins"><div class="menu-pane-header">Pins<button class="unpin-all">clear</button></div><ul id="menu-pins-list"></ul></div><div class="menu-pane-header">Table of Contents</div><div id="menu-toc"><ol class="toc"><li><span class="item-toggle">+</span><a href="#sup-temporal-calendar-abstract-ops" title="Abstract Operations for Temporal.Calendar Objects"><span class="secnum">1</span> Abstract Operations for Temporal.Calendar Objects</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#sec-temporal-calendarsupportsera" title="CalendarSupportsEra ( calendar )"><span class="secnum">1.1</span> CalendarSupportsEra ( <var>calendar</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sec-temporal-canonicalizeeraincalendar" title="CanonicalizeEraInCalendar ( calendar, era )"><span class="secnum">1.2</span> CanonicalizeEraInCalendar ( <var>calendar</var>, <var>era</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sec-temporal-isvalidmonthecodeforcalendar" title="IsValidMonthCodeForCalendar ( calendar, monthCode )"><span class="secnum">1.3</span> IsValidMonthCodeForCalendar ( <var>calendar</var>, <var>monthCode</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sec-temporal-isvaliderayearforcalendar" title="IsValidEraYearForCalendar ( calendar, era, eraYear )"><span class="secnum">1.4</span> IsValidEraYearForCalendar ( <var>calendar</var>, <var>era</var>, <var>eraYear</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardateera" title="CalendarDateEra ( calendar, date )"><span class="secnum">1.5</span> CalendarDateEra ( <var>calendar</var>, <var>date</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardateerayear" title="CalendarDateEraYear ( calendar, date )"><span class="secnum">1.6</span> CalendarDateEraYear ( <var>calendar</var>, <var>date</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardatearithmeticyear" title="CalendarDateArithmeticYear ( calendar, date )"><span class="secnum">1.7</span> CalendarDateArithmeticYear ( <var>calendar</var>, <var>date</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardatefields" title="CalendarDateFields ( calendar, fields )"><span class="secnum">1.8</span> CalendarDateFields ( <var>calendar</var>, <var>fields</var> )</a></li><li><span class="item-toggle-none"></span><a href="#sup-temporal-calendardatemergefields" title="CalendarDateMergeFields ( calendar, fields, additionalFields )"><span class="secnum">1.9</span> CalendarDateMergeFields ( <var>calendar</var>, <var>fields</var>, <var>additionalFields</var> )</a></li></ol></li><li><span class="item-toggle-none"></span><a href="#sec-copyright-and-software-license" title="Copyright & Software License">Copyright & Software License</a></li></ol></div></div><div id="spec-container"><h1 class="version">Stage 2 Draft / July 7, 2025</h1><h1 class="title">Intl era and monthCode Proposal</h1> |
| 3962 | +
|
3964 | 3963 | <emu-clause id="sup-temporal-calendar-abstract-ops">
|
3965 | 3964 | <h1><span class="secnum">1</span> Abstract Operations for Temporal.Calendar Objects</h1>
|
| 3965 | +
|
3966 | 3966 | <emu-clause id="sec-temporal-calendarsupportsera" type="abstract operation" aoid="CalendarSupportsEra">
|
3967 | 3967 | <h1><span class="secnum">1.1</span> CalendarSupportsEra ( <var>calendar</var> )</h1>
|
3968 | 3968 | <p>The abstract operation CalendarSupportsEra takes argument <var>calendar</var> (a String) and returns a Boolean.
|
@@ -4194,7 +4194,7 @@ <h1><span class="secnum">1.1</span> CalendarSupportsEra ( <var>calendar</var> )<
|
4194 | 4194 | <emu-clause id="sec-temporal-canonicalizeeraincalendar" type="abstract operation" aoid="CanonicalizeEraInCalendar">
|
4195 | 4195 | <h1><span class="secnum">1.2</span> CanonicalizeEraInCalendar ( <var>calendar</var>, <var>era</var> )</h1>
|
4196 | 4196 | <p>The abstract operation CanonicalizeEraInCalendar takes arguments <var>calendar</var> (a String) and <var>era</var> (a String) and returns a String or <emu-val>undefined</emu-val>.
|
4197 |
| - The following algorithm refers to the era data from <a href="https://unicode.org/reports/tr35/tr35-dates.html#Calendar_Data">UTS 35's Supplemental Calendar Data</a>. |
| 4197 | + The following algorithm refers to the era data from <a href="https://unicode.org/reports/tr35/tr35-dates.html#Calendar_Data">UTS 35's Supplemental Calendar Data</a>. |
4198 | 4198 | It performs the following steps when called:</p>
|
4199 | 4199 | <emu-alg><ol><li>For each row of <emu-xref href="#table-eras" id="_ref_1"><a href="#table-eras">Table 1</a></emu-xref>, do<ol><li>Let <var>cal</var> be the Calendar value of the current row.</li><li>If <var>cal</var> is equal to <var>calendar</var>, then<ol><li>Let <var>e</var> be the Era value of the current row.</li><li>If <var>e</var> is equal to <var>era</var>, return <var>era</var>.</li><li>Let <var>aliases</var> be a <emu-xref href="#sec-list-and-record-specification-type"><a href="https://tc39.es/ecma262/#sec-list-and-record-specification-type">List</a></emu-xref> whose elements are the strings given in the Aliases column of the row.</li><li>If <var>aliases</var> contains <var>era</var>, return <var>era</var>.</li></ol></li></ol></li><li>Return <emu-val>undefined</emu-val>.</li></ol></emu-alg>
|
4200 | 4200 | </emu-clause>
|
@@ -4244,27 +4244,23 @@ <h1><span class="secnum">1.3</span> IsValidMonthCodeForCalendar ( <var>calendar<
|
4244 | 4244 | <emu-clause id="sec-temporal-isvaliderayearforcalendar" type="abstract operation" aoid="IsValidEraYearForCalendar">
|
4245 | 4245 | <h1><span class="secnum">1.4</span> IsValidEraYearForCalendar ( <var>calendar</var>, <var>era</var>, <var>eraYear</var> )</h1>
|
4246 | 4246 | <p>The abstract operation IsValidEraYearForCalendar takes arguments <var>calendar</var> (a String), <var>era</var> (a String), and <var>eraYear</var> (a <emu-xref href="#integer"><a href="https://tc39.es/ecma262/#integer">integer</a></emu-xref>) and returns a Boolean.
|
4247 |
| - The following algorithm refers to the era data from <a href="https://unicode.org/reports/tr35/tr35-dates.html#Calendar_Data">UTS 35's Supplemental Calendar Data</a>. |
| 4247 | + The following algorithm refers to the era data from <a href="https://unicode.org/reports/tr35/tr35-dates.html#Calendar_Data">UTS 35's Supplemental Calendar Data</a>. |
4248 | 4248 | It performs the following steps when called:</p>
|
4249 | 4249 | <emu-alg><ol><li>Let <var>era</var> be <emu-xref aoid="CanonicalizeEraInCalendar" id="_ref_6"><a href="#sec-temporal-canonicalizeeraincalendar">CanonicalizeEraInCalendar</a></emu-xref>(<var>calendar</var>, <var>era</var>).</li><li>If <var>era</var> is <emu-val>undefined</emu-val>, return <emu-val>false</emu-val>.</li><li>Let <var>r</var> be the row in <emu-xref href="#table-eras" id="_ref_4"><a href="#table-eras">Table 1</a></emu-xref> which the <var>calendar</var> is in the Calendar column and the <var>era</var> is in the Era column.</li><li>Let <var>min</var> be the value given in the <emu-val>"Minimum eraYear"</emu-val> column of <var>r</var>.</li><li>Let <var>max</var> be the value given in the <emu-val>"Maximum eraYear"</emu-val> column of <var>r</var>.</li><li>If <var>eraYear</var> < <var>min</var>, return <emu-val>false</emu-val>.</li><li>If <var>eraYear</var> > <var>max</var>, return <emu-val>false</emu-val>.</li><li>Return <emu-val>true</emu-val>.</li></ol></emu-alg>
|
4250 | 4250 | </emu-clause>
|
4251 | 4251 |
|
4252 | 4252 | <emu-clause id="sup-temporal-calendardateera" type="abstract operation" aoid="CalendarDateEra">
|
4253 | 4253 | <h1><span class="secnum">1.5</span> CalendarDateEra ( <var>calendar</var>, <var>date</var> )</h1>
|
4254 | 4254 | <p>The abstract operation CalendarDateEra takes arguments <var>calendar</var> (a String) and <var>date</var> (a Temporal.PlainDateTime, Temporal.PlainDate, or Temporal.PlainYearMonth) and returns a String or <emu-val>undefined</emu-val>. It performs <emu-xref href="#implementation-defined"><a href="https://tc39.es/ecma262/#implementation-defined">implementation-defined</a></emu-xref> processing to find the era for the date corresponding to <var>date</var> in the context of the calendar represented by <var>calendar</var> and returns a lowercase String value representing that era, or <emu-val>undefined</emu-val> for calendars that do not have eras.</p>
|
4255 |
| - <p> |
4256 |
| - This definition supersedes the definition provided in "Temporal proposal", #sec-temporal-calendardateera. |
4257 |
| - </p> |
| 4255 | + <p>This definition supersedes the definition provided in "Temporal proposal", #sec-temporal-calendardateera.</p> |
4258 | 4256 | <emu-alg><ol><li>If <emu-xref aoid="CalendarSupportsEra" id="_ref_7"><a href="#sec-temporal-calendarsupportsera">CalendarSupportsEra</a></emu-xref>(<var>calendar</var>) is <emu-val>false</emu-val>, return <emu-val>undefined</emu-val>.</li><li>Let <var>era</var> be the String to indicate the era corresponding to <var>date</var> in the context of the calendar represented by <var>calendar</var> from an <emu-xref href="#implementation-defined"><a href="https://tc39.es/ecma262/#implementation-defined">implementation-defined</a></emu-xref> processing.</li><li>Return <emu-xref aoid="CanonicalizeEraInCalendar" id="_ref_8"><a href="#sec-temporal-canonicalizeeraincalendar">CanonicalizeEraInCalendar</a></emu-xref>(<var>calendar</var>, <var>era</var>).</li></ol></emu-alg>
|
4259 | 4257 | </emu-clause>
|
4260 | 4258 |
|
4261 | 4259 | <emu-clause id="sup-temporal-calendardateerayear" type="abstract operation" aoid="CalendarDateEraYear">
|
4262 | 4260 | <h1><span class="secnum">1.6</span> CalendarDateEraYear ( <var>calendar</var>, <var>date</var> )</h1>
|
4263 | 4261 | <p>The abstract operation CalendarDateEraYear takes arguments <var>calendar</var> (a String) and <var>date</var> (a Temporal.PlainDateTime, Temporal.PlainDate, or Temporal.PlainYearMonth) and returns an <emu-xref href="#integer"><a href="https://tc39.es/ecma262/#integer">integer</a></emu-xref> or <emu-val>undefined</emu-val>. It performs <emu-xref href="#implementation-defined"><a href="https://tc39.es/ecma262/#implementation-defined">implementation-defined</a></emu-xref> processing to find the era for the date corresponding to <var>date</var> in the context of the calendar represented by <var>calendar</var> and returns an <emu-xref href="#integer"><a href="https://tc39.es/ecma262/#integer">integer</a></emu-xref> representing the ordinal position of the year of <var>date</var> in that era, or <emu-val>undefined</emu-val> for calendars that do not have eras.</p>
|
4264 | 4262 |
|
4265 |
| - <p> |
4266 |
| - This definition supersedes the definition provided in "Temporal proposal", #sec-temporal-calendardateerayear. |
4267 |
| - </p> |
| 4263 | + <p>This definition supersedes the definition provided in "Temporal proposal", #sec-temporal-calendardateerayear.</p> |
4268 | 4264 | <emu-alg><ol><li>If <emu-xref aoid="CalendarSupportsEra" id="_ref_9"><a href="#sec-temporal-calendarsupportsera">CalendarSupportsEra</a></emu-xref>(<var>calendar</var>) is <emu-val>false</emu-val>, return <emu-val>undefined</emu-val>.</li><li>Let <var>eraYear</var> be the <emu-xref href="#integer"><a href="https://tc39.es/ecma262/#integer">integer</a></emu-xref> to indicate the era year corresponding to <var>date</var> in the context of the calendar represented by <var>calendar</var> from an <emu-xref href="#implementation-defined"><a href="https://tc39.es/ecma262/#implementation-defined">implementation-defined</a></emu-xref> processing.</li><li><emu-xref href="#assert"><a href="https://tc39.es/ecma262/#assert">Assert</a></emu-xref>: <var>eraYear</var> is an <emu-xref href="#integer"><a href="https://tc39.es/ecma262/#integer">integer</a></emu-xref>.</li><li>Return <var>eraYear</var>.</li></ol></emu-alg>
|
4269 | 4265 | <emu-note><span class="note">Note</span><div class="note-contents">
|
4270 | 4266 | Era years are 1-indexed for many calendars, but not all (e.g., the eras of the Burmese calendar each start with a year 0). Years can also advance opposite the flow of time (as for BCE years in the Gregorian calendar).
|
@@ -4361,18 +4357,14 @@ <h1><span class="secnum">1.7</span> CalendarDateArithmeticYear ( <var>calendar</
|
4361 | 4357 | <h1><span class="secnum">1.8</span> CalendarDateFields ( <var>calendar</var>, <var>fields</var> )</h1>
|
4362 | 4358 | <p>The abstract operation CalendarDateFields takes arguments <var>calendar</var> (a String) and <var>fields</var> (a <emu-xref href="#sec-list-and-record-specification-type"><a href="https://tc39.es/ecma262/#sec-list-and-record-specification-type">List</a></emu-xref> of Strings) and returns a <emu-xref href="#sec-list-and-record-specification-type"><a href="https://tc39.es/ecma262/#sec-list-and-record-specification-type">List</a></emu-xref> of Strings. It takes a list of standard fields in <var>fields</var> that are necessary for a given operation and returns a new list by adding relevant calendar-specific fields for the calendar represented by <var>calendar</var>. This is relevant for calendars which accept fields other than the standard set of built-in calendar fields.</p>
|
4363 | 4359 |
|
4364 |
| - <p> |
4365 |
| - This definition supersedes the definition provided in "Temporal proposal", #sec-temporal-calendardatefields. |
4366 |
| - </p> |
| 4360 | + <p>This definition supersedes the definition provided in "Temporal proposal", #sec-temporal-calendardatefields.</p> |
4367 | 4361 | <emu-alg><ol><li>If <var>fields</var> contains an element equal to <emu-val>"year"</emu-val> and <emu-xref aoid="CalendarSupportsEra" id="_ref_10"><a href="#sec-temporal-calendarsupportsera">CalendarSupportsEra</a></emu-xref>(<var>calendar</var>) is <emu-val>true</emu-val>, then<ol><li>Append <emu-val>"era"</emu-val> to <var>fields</var>.</li><li>Append <emu-val>"eraYear"</emu-val> to <var>fields</var>.</li></ol></li><li>Return <var>fields</var>.</li></ol></emu-alg>
|
4368 | 4362 | </emu-clause>
|
4369 | 4363 |
|
4370 | 4364 | <emu-clause id="sup-temporal-calendardatemergefields" type="abstract operation" aoid="CalendarDateMergeFields">
|
4371 | 4365 | <h1><span class="secnum">1.9</span> CalendarDateMergeFields ( <var>calendar</var>, <var>fields</var>, <var>additionalFields</var> )</h1>
|
4372 | 4366 | <p>The abstract operation CalendarDateMergeFields takes arguments <var>calendar</var> (a String), <var>fields</var> (an Object), and <var>additionalFields</var> (an Object) and returns either a <emu-xref href="#sec-completion-record-specification-type"><a href="https://tc39.es/ecma262/#sec-completion-record-specification-type">normal completion containing</a></emu-xref> an Object or an <emu-xref href="#sec-completion-record-specification-type"><a href="https://tc39.es/ecma262/#sec-completion-record-specification-type">abrupt completion</a></emu-xref>. It takes two Objects of calendar-specific fields for the calendar represented by <var>calendar</var> in <var>fields</var> and <var>additionalFields</var> and returns a new Object that includes both sets of fields. The values in <var>additionalFields</var> should supersede the values in <var>fields</var>. Also, the returned Object must be free of ambiguity or conflicts. This is relevant for calendars which accept fields other than the standard set of built-in calendar fields.</p>
|
4373 |
| - <p> |
4374 |
| - This definition supersedes the definition provided in "Temporal proposal", #sec-temporal-calendardatemergefields. |
4375 |
| - </p> |
| 4367 | + <p>This definition supersedes the definition provided in "Temporal proposal", #sec-temporal-calendardatemergefields.</p> |
4376 | 4368 | <emu-note><span class="note">Note</span><div class="note-contents">
|
4377 | 4369 | For example, if <var>fields</var> contains <emu-val>"year"</emu-val> but <var>additionalFields</var> contains <emu-val>"era"</emu-val> and <emu-val>"eraYear"</emu-val>, then the returned list must not include <emu-val>"year"</emu-val> in order to avoid ambiguity or conflict between different ways of specifying the year.
|
4378 | 4370 | </div></emu-note>
|
|
0 commit comments