前回の内容について、以下の点の振り返りが行われました。
+09:18:59 から +09:00:00 へ変更された。Date オブジェクトの挙動などで興味深いエッジケースとなる。Time, Day, Date などに加え、FullYear の仕様について。Date コンストラクタの第一引数に 0 ~ 99 を渡すと、1900年代(1900~1999)として扱われる仕様の再確認。Time Value の範囲(約±27万年)に収める処理。ECMAScriptにおける日付時刻の文字列表現についての定義が読み進められました。
YYYY-MM-DDTHH:mm:ss.sssZYYYY: 先発グレゴリオ暦(proleptic Gregorian calendar)における年。
0000 ~ 9999 の4桁。+ か - に続く6桁の数字。-: ハイフン(文字通り2回出現)。MM: 月(01~12)。DD: 日(01~31)。T: 時間要素の始まりを示す区切り文字(文字通り出現)。HH: 時(00~24)。:: コロン(文字通り2回出現)。mm: 分(00~59)。ss: 秒(00~59)。.: ドット(文字通り出現)。sss: ミリ秒(000~999、3桁である必要がある)。Z: UTCオフセット表現。
Z。+ または - に続く HH:mm 形式(Time Zone Offset String Formatのサブセット)。YYYY-MM-DD のような日付のみの形式も含まれる。00:00 と 24:00 という表記が利用可能。1995-02-04T24:001995-02-05T00:0024:00 の使用が再導入されたとの情報あり(以前は削除されていた時期があった)。EST(Eastern Standard Time)や CET(Central European Time)のような市民用タイムゾーン(Civil Time Zones)の略称に関する国際標準は存在しない。1970年1月1日を基準とした約±273,790年の範囲(Time Valueの範囲)をカバーするための仕様です。
+ または - を付ける必要がある(例: +002026)。+000000 と表記されなければならない。-000000 は無効(Invalid)。Date.parse において「認識不能(unrecognizable)」として扱われ、NaN を返す。0 年(+000000)となる(天文学的記法と同様)。紀元前ではなく西暦0年という概念。0001 BC = 0 (year)-271821-04-20... (紀元前約27万年)+275760-09-13... (西暦約27万年)タイムゾーンオフセットの文字列形式(UTCから派生)についての定義です。ここで文法記法(Grammar Notation)に関する深い議論が行われました。
::: (3つのコロン) の意味仕様書に出てくる NumericStringGrammar の定義において、::: という記法が使われている点についての解説がありました。
: (1つ): Syntactic Grammar(構文的文法)。:: (2つ): Lexical & RegExp Grammar(字句および正規表現文法)。::: (3つ): Numeric String Grammar。
StringToNumber の変換や、今回の Date.parse 等で文字列を解釈する際など。議論の中で、参照していた箇所が Time Zone Offset String Format の文法そのものではなく、汎用的な String to Number(7.1.4.1)の文法定義(StringNumericLiteral)を読んでいたことが判明しましたが、::: の概念理解には役立ちました。
StrWhiteSpace)が許容される。_)は、ソースコード上では許容されるが、文字列からの変換(Number("1_000")など)では許容されない(セパレーター無しの定義が参照されているため)。改めてタイムゾーン周りの文法を確認した際の疑問点:
MinuteSecond の後に小数点が続くなど)が見受けられた。Date.parse や new Date() に、タイムゾーンオフセット部分に細かい数値(例: +09:00:00.000 など)を入れて試行。
Invalid Date になるか挙動が複雑。+09:18:59 のような秒単位のオフセットは、1888年のJSTのような歴史的な時刻を表現する際には必要になる可能性がある。TemporalDecimalFraction 等が具体的にどう効いてくるのかを確認する。