ISO-8601とRFC 3339は、日時データをコンピュータが扱いやすいようにシリアライズするための業界標準規格です。
しかし、これらの規格は、ECMAScript ユーザーが望むすべてのケースで十分とは言えません。ISO-8601 や RFC 3339 がカバーしていない、以下の 3 つの重要なユースケースがあります:
このドキュメントの目的は、Temporal
のために ISO-8601 や RFC 3339 を補足することです。
Joda Time(現在は java.time)のような、ブラケットを用いてタイムゾーンを付記するようなライブラリの先例がいくつかあります。ECMAScript では、この記法を入力と出力の両方で完全にサポートする予定です。
例:
2007-12-03T10:15:30+01:00[Europe/Paris]
ISO-8601 も RFC 3339 も、この記法については言及していませんが、Temporal
ではこれらを事実上の業界標準として採用します。
タイムゾーンの文字列は、タイムゾーンデータベースのルールにしたがって書かれます。(詳しくはtimezone.mdを参照)ルールに関する詳しい情報はこちらのドキュメントを参照してください。
有効な POSIX ファイル名のみを用いる(つまり、
'/'
以外の部分を用いる)。'.'
と'..'
を用いてはいけない。 ASCII 文字、'.'
、'-'
、'_'
のみを用いる。 タイムゾーン名の曖昧さを避けるために、数字は用いない。 14 文字を超えてはいけない。また、'-'
から始まってはいけない。
ISO-8601 と RFC 3339 は Temporal.PlainDate
、Temporal.PlainTime
、Temporal.PlainDateTime
およびTemporal.PlainYearMonth
に対応する記法を提供していますが、特別な場合を除いてTemporal.PlainMonthDay
に対応する記法はありません。したがって、Temporal
では次のような記法を追加で定義します。
07-04
上記の文字列は ISO カレンダー上の 7 月 4 日を表します。
RFC 3339 では月と日の構文をサポートするための--07-04
という記法が定義されていますが、Temporal
はこの記法を入力として受け付けますが、出力することはありません。
ISO 以外のカレンダーを用いてTemporal
における永続性を実現するためには、カレンダーシステムの識別子を記法として追加する必要があります。
私達は、カレンダーシステムの識別子を ISO 8601 や RFC 3339 として表現する既存の方法を見つけられませんでした。したがって、新たに次のような拡張を提案します:カレンダー固有の日付は、シリアライズされた文字列上では ISO カレンダーの日付として表されます。カレンダーを表す接尾辞は、文字列をコンピュータが読み取る際に、どのカレンダーシステムへ ISO カレンダーの日付を変換するかを示します。
例えば、ユダヤ暦における 28 Iyar 5780 を文字列にパースすると次のようになります。
2020-05-22[u-ca=hebrew]
現在 CalConnect や IETF Calsify といった団体と協力して、この構文の標準化を進めています。
このカレンダー識別子はCLDR によって3〜8 文字の BCP47 のサブタグ文字列として定義されます。CLDR が現在サポートしているカレンダー識別子の一覧を次に示します:
buddhist
chinese
coptic
dangi
ethioaa
ethiopic
gregory
hebrew
indian
islamic
islamic-umalqura
islamic-tbla
islamic-civil
islamic-rgsa
iso8601
japanese
persian
roc
islamicc
(islamic-civil
の使用が推奨されたため、こちらは非推奨)なお、IANA タイムゾーンとカレンダーシステムの両方を用いて作成される最も長い日時文字列の例は次のとおりです:
2020-05-22T07:19:35.356-04:00[America/Indiana/Indianapolis][u-ca=islamic-umalqura]
データモデルに関する#391の議論にもとづき、ISO 以外のカレンダーでTemporal.YearMonth
やTemporal.MonthDay
を使いたい場合はTemporal.PlainDate
を代わりに用いることとします。例えば、ユダヤ暦で"Iyar 5780"(訳注:5780 は年、Iyar は月を表している)をTemporal.YearMonth
で表したい場合、その月の最初の日を使って2020-04-25
という表現が用いられます。
ISO 文字列として表現すると次のようになります。
2020-04-25[u-ca=hebrew]
この文字列がTemporal.PlainDate
、Temporal.YearMonth
またはTemporal.MonthDay
の、どのデータ型を表すかは曖昧なため、デシリアライズする際には適切なコンストラクタを使用するように気をつける必要があります。
すべてのTemporal
タイプは、永続化と相互運用性のための文字列表現を持っています。ほとんどのタイプは、既存の標準のみを使用し、そうではない一部の例外だけを上記で説明しました。タイプと文字列の対応を以下に示します。