[30] [DFN[JavaScriptの日時形式]]は、
[[ISO 8601]] の[[プロファイル]]や[[ミリ秒]][[単位]]の [[Unix time]]
など、いくつかあります。

* 仕様書

[REFS[
- [1] [CITE@en-GB[ECMAScript Language Specification ECMA-262 6th Edition – DRAFT]] ([TIME[2014-04-28 18:21:11 +09:00]] 版) <https://people.mozilla.org/~jorendorff/es6-draft.html#sec-date-time-string-format>
-- [12] 旧版 [CITE[Annotated ES5]] ([TIME[2013-09-01 02:12:18 +09:00]] 版) <http://es5.github.io/#x15.9.1.15>
]REFS]

* ISO 8601 のプロファイル

[2] >>1 の [[ECMAScript]] で規定されているのは、[[ISO 8601の日付形式]]の[[プロファイル]]です。

[4] [CODE(JS)@en[[[toISOString]]]] はこの形式を採用しています。

[13] [[日付]]は、
- [14] [CODE[YYYY-MM-DD]]
- [15] [CODE[YYYY-MM]]
- [16] [CODE[YYYY]]

のいずれかの形式とします。ここで[[年]]は0000~9999、[[月]]は01~12、[[日]]は01~31となっています。 [SRC[>>1]]

;; [17] [[日の数]]の制約は明示されていませんが、[[ISO 8601]] の制限を引き継ぐと解釈するのが妥当でしょう。

[18] [[日付]]に続いて次のいずれかにより[[日時]]を表せます [SRC[>>1]]。
- [19] [CODE[Thh:mm:ss.sss]]
- [20] [CODE[Thh:mm:ss]]
- [21] [CODE[Thh:mm]]

[22] ここで[[時]]は00~24、[[分]]は00~59、[[秒]]は00~59となっています [SRC[>>1]]。
[[秒の小数部]]も指定できますが、3桁固定とされています [SRC[>>1]]。

;; [23] [[時]]が24のとき[[分]]や[[秒]]の制約は明記されていませんが、 [[ISO 8601]]
の制限 (0でなければならない) を引き継ぐと解釈するのが妥当でしょうか。

;; [24] [[閏秒]]は表せません。

;; [26] [[ISO 8601:2004]] では認められていないようですが、[[月]]や[[日]]を省略しても[[時刻]]を指定できるようです。

[25] [[日時]]には更に[[時間帯]]も指定できます。[[時間帯]]を指定する場合は [CODE[[[Z]]]]
か、 [CODE[±hh:mm]] の[[時差]]を使います。 [SRC[>>1]]

[27] [[時間帯]]がなければ[[地方時]]と解釈します [SRC[>>1]]。

[28] [[年]]の[[展開表現]]も認められていますが、その場合[[符号]]の後の[[年]]は6桁でなければなりません
[SRC[>>1]]。

;; [29] [[ISO 8601]] 同様、 [CODE[-000000]] は認めていないようです。 (0年は[[正]])

* 歴史的な日時形式

[3] [CODE(JS)@en[[[Date]]]] [[コンストラクター]]や [CODE(JS)@en[[[Date.parse]]]] や
[CODE(JS)@en[[[toString]]]], [CODE(JS)@en[[[toDateString]]]], [CODE(JS)@en[[[toTimeString]]]],
[CODE(JS)@en[[[toUTCString]]]], [CODE(JS)@en[[[toGMTString]]]],
[CODE(DOMa)@en[[[lastModified]]]] では歴史的に色々な[[日付形式]]が使われてきました。
現在の [[ECMAScript]] 仕様でも実装依存とされています。

* ロケール依存の日時形式

[5] [CODE(JS)@en[[[toLocaleString]]]]、[CODE(JS)@en[[[toLocaleDateString]]]]、
[CODE(JS)@en[[[toLocaleTimeString]]]] は[[ロケール]]依存かつ実装依存の[[日付形式]]となっています。

[6] [[ECMA-402]] の [[API]] により細かく指定できます。

* [CODE(JS)@en[Date]] オブジェクト

[7] [[JavaScript]] の[[日付型]]は [CODE(JS)@en[[[Date]]]] です。いくつかの [[API]] は [CODE(JS)@en[[[Date]]]]
を入出力に使っています。

;; [9] [[WebIDL]] にも [CODE(IDL)@en[[[Date]]]] 型があります。

* 数値としての日時

[8] [[JavaScript]] の[[プログラム]]では、
しばしば[[日時]]は[[数値]]として[[表されます][整数時刻系]]。

;; [10] [[WebIDL]] に [CODE(IDL)@en[[[DOMTimeStamp]]]] 型、
[CODE(IDL)@en[[[DOMHighResTimeStamp]]]] 型があります。

[11] [CODE(JS)[[[Date]]]] が内部的に表しているのは[[ミリ秒]]単位の[[Unix time]]
([[JavaScript時刻]]) です。
[CODE(JS)@en[Date]] [[コンストラクター]]や [CODE[valueOf]]
[[メソッド]]で相互変換できます。

* メモ