本頁の目次 目次 次頁: 15-10_RegExp_Objects 前頁: 15-8_The_Math_Object
Date オブジェクトは、時間内の個々の瞬間をミリ秒で示す数で構成される。まずは NaN であることもあり、 Date オブジェクトが時間の特定の瞬間をあらわさないことを示す。
次セクションは時間値の演算のための数々の関数を定義する。 各ケースについて、その関数の引数が NaN ならば、結果は NaN となる。
時間は、 ECMAScript では UTC 1970 年 1 月 1 日 からのミリ秒で計測される。うるう秒は無視される。一日あたり正解に 86,400,000 秒ということにする。 ECMAScript 数値は -9,007,199,254,740,991 から 9,007,199,254,740,991 まで表現できる; この範囲は、 UTC 1970 年 1 月 1 日 を基点とする前後約 285,616 年間の任意の瞬間の、厳密なミリ秒での時間計測を可能にする。
ECMAScript Date オブジェクトがサポートする実際の時間の範囲はわずかに小さい; 厳密には、 UTC 1970 年 1 月 1 日開始時の午前零時から計測される -100,000,000 日から 100,000,000 日である。 これは UTC 1970 年 1 月 1 日 から過去未来の両側に 8,640,000,000,000,000 ミリ秒の範囲を与える。
厳密な UTC 1970 年 1 月 1 日開始時の午前零時は、値 +0 で表される。
時間値 t は日数 (day number) に属する
Day(t) = floor(t / msPerDay)
一日あたりのミリ秒数のところは
msPerDay = 86400000
残りは一日内の時間と呼ばれる:
TimeWithinDay(t) = t modulo msPerDay
ECMAScript は、日数の年数へのマップと一年内の月日の決定にグレゴリオ暦を用いる。このシステムでは、うるう年は正確に (4 で割り切れる) かつ ((100 で割り切れない) または (400 で割り切れる)) ような年である。それゆえ年数 y の日数は次のように定義される。
DaysInYear(y) = 365 if (y modulo 4) ≠ 0 = 366 if (y modulo 4) = 0 and (y modulo 100) ≠ 0 = 365 if (y modulo 100) = 0 and (y modulo 400) ≠ 0 = 366 if (y modulo 400) = 0
非うるう年は通常の月ごとの日数で 365 日であり、うるう年は 2 月に追加日を持つ。 年 y の最初の日の日数は次に与えられる:
DayFromYear(y) = 365 × (y(1970) + floor((y(1969)/4) − floor((y(1901)/100) + floor((y−1601)/400)
年の開始の時間値は:
TimeFromYear(y) = msPerDay ( DayFromYear(y)
時間値は次によって年を決定する:
YearFromTime(t) = TimeFromYear(y) ≤ t であるような (正の無限大に最も近い) 最大整数 y
うるう年関数は、時間がうるう年内であれば 1 であり、そうでなければ 0 である:
InLeapYear(t) = 0 if DaysInYear(YearFromTime(t)) = 365 = 1 if DaysInYear(YearFromTime(t)) = 366
月は、 0 から 11 の範囲の整数で識別される。時間値 t から月数へのマッピング MonthFromTime(t) は次で定義される:
MonthFromTime(t) = 0 if 0 ≤ DayWithinYear(t) < 31 = 1 if 31 ≤ DayWithinYear (t) < 59+InLeapYear(t) = 2 if 59+InLeapYear(t) ≤ DayWithinYear (t) < 90+InLeapYear(t) = 3 if 90+InLeapYear(t) ≤ DayWithinYear (t) < 120+InLeapYear(t) = 4 if 120+InLeapYear(t) ≤ DayWithinYear (t) < 151+InLeapYear(t) = 5 if 151+InLeapYear(t) ≤ DayWithinYear (t) < 181+InLeapYear(t) = 6 if 181+InLeapYear(t) ≤ DayWithinYear (t) < 212+InLeapYear(t) = 7 if 212+InLeapYear(t) ≤ DayWithinYear (t) < 243+InLeapYear(t) = 8 if 243+InLeapYear(t) ≤ DayWithinYear (t) < 273+InLeapYear(t) = 9 if 273+InLeapYear(t) ≤ DayWithinYear (t) < 304+InLeapYear(t) = 10 if 304+InLeapYear(t) ≤ DayWithinYear (t) < 334+InLeapYear(t) = 11 if 334+InLeapYear(t) ≤ DayWithinYear (t) < 365+InLeapYear(t)
DayWithinYear(t) は次のように定義する
DayWithinYear(t) = Day(t)(DayFromYear(YearFromTime(t))
月の値 0 は 1 月を指す; 1 は 2 月を指す ; 2 は 3 月を指す; 3 は 4 月を指す; 4 は 5 月を指す; 5 は 6 月を指す; 6 は 7 月を指す; 7 は 8 月を指す; 8 は 9 月を指す; 9 は 10 月を指す; 10 は 11 月を指す; 11 は 12 月を指す。 MonthFromTime(0) = 0 は 1970 年 1 月 1 日木曜日 に該当することに注意。
日付は、 1 から 31 の範囲の整数で識別される。時間値 t から日付数へのマッピング DateFromTime(t) は次で定義される:
DateFromTime(t) = DayWithinYear(t)+1 if MonthFromTime(t)=0 = DayWithinYear(t)− 30 if MonthFromTime(t)=1 = DayWithinYear(t)− 58(InLeapYear(t) if MonthFromTime(t)=2 = DayWithinYear(t)− 89(InLeapYear(t) if MonthFromTime(t)=3 = DayWithinYear(t)−119(InLeapYear(t) if MonthFromTime(t)=4 = DayWithinYear(t)−150(InLeapYear(t) if MonthFromTime(t)=5 = DayWithinYear(t)−180(InLeapYear(t) if MonthFromTime(t)=6 = DayWithinYear(t)−211(InLeapYear(t) if MonthFromTime(t)=7 = DayWithinYear(t)−242(InLeapYear(t) if MonthFromTime(t)=8 = DayWithinYear(t)−272(InLeapYear(t) if MonthFromTime(t)=9 = DayWithinYear(t)−303(InLeapYear(t) if MonthFromTime(t)=10 = DayWithinYear(t)−333(InLeapYear(t) if MonthFromTime(t)=11
個々の時間値 t の曜日はこのように定義する。
WeekDay(t) = (Day(t) + 4) modulo 7
曜日値 0 は日曜日を指す; 1 は月曜日を指す; 2 は火曜日を指す; 3 は水曜日を指す; 4 は木曜日を指す; 5 は金曜日を指す; 6 は土曜日を指す。 WeekDay(0) = 4 は、 1970 年 1 月 1 日木曜日 に該当することに注意。
ECMAScript 実装は地方調整時の決定を期待される。地方調整時は、 UTC に追加して地方標準時をあらわす、ミリ秒で測られる値 LocalTZA である。値 LocalTZA は時間によっては変わらないが、地理的な位置に依存する。
ECMAScript 実装は、夏時間調整アルゴリズムの決定を期待される。ミリ秒で測られる夏時間調整 DaylightSavingTA(t) を決定するアルゴリズムは、次の 4 点にのみ依存する:
(1)年の開始からの時間
t - TimeFromYear(YearFromTime(t))
(2)t がうるう年かどうか
InLeapYear(t)
(3)年の開始の曜日
WeekDay(TimeFromYear(YearFromTime(t))
(4)地理的な位置
ECMASciript 実装は正確な時間が夏時間に従ったか否かの決定を試みるべきではないが、その時現在の夏時間アルゴリズムが使われているならば、夏時間の影響下にあるかどうかの決定を試みるべきである。これは年回りで夏時間を認められるロケールの年を考慮するようなような煩雑さ回避する (This avoids complications such as taking into account the years that the locale observed daylight saving time year round.)。
ホスト環境が夏時間調整の決定の機能性を提供するならば、 ECMAScript 実装は、問題の年をホスト環境が夏時間調整情報を提供する同等の年 (同じ閏年で同じ曜日に開始しうる年) に自由にマップできる。同等である全ての年が同じ結果を生成するべきであるということだけ制限される。
UTC から地方時への変換は
LocalTime(t) = t + LocalTZA + DaylightSavingTA(t)
地方時から UTC への変換は
UTC(t) = t - LocalTZA - DaylightSavingTA(t - LocalTZA)
UTC(LocalTime(t)) は常に t と等しいとは限らないことに注意。
次の関数が時間値の分解に使用される:
HourFromTime(t) = floor(t / msPerHour) modulo HoursPerDay MinFromTime(t) = floor(t / msPerMinute) modulo MinutesPerHour SecFromTime(t) = floor(t / msPerSecond) modulo SecondsPerMinute msFromTime(t) = t modulo msPerSecond
それぞれ次のように定める:
HoursPerDay = 24 MinutesPerHour = 60 SecondsPerMinute = 60 msPerSecond = 1000 msPerMinute = msPerSecond × SecondsPerMinute = 60000 msPerHour = msPerMinute × MinutesPerHour = 3600000
MakeTime 演算子は、 ECMAScript 数値 でなければならない 4 つの引数から、ミリ秒の数を算出する。この演算子は次のように機能する:
MakeDay 演算子は、 ECMAScript 数値 でなければならない 3 つの引数から、日数の数を算出する。この演算子は次のように機能する:
MakeDate 演算子は、 ECMAScript 数値 でなければならない 2 つの引数から、ミリ秒の数を算出する。この演算子は次のように機能する:
TimeClip 演算子は、 ECMAScript 数値 でなければならない引数から、ミリ秒の数を算出する。この演算子は次のように機能する:
NOTE ステップ 3 のポイントは、時間値の内部表現、例えば 符号付き 64 ビット整数、または 64 ビット浮動小数点数の値の選択を実装に許可することである。実装に依存して、この内部表現は −0 と +0 を区別してもしなくてもよい。
コンストラクタとしてではなく関数として Date が呼出されるとき、それは現在時間 (UTC) のあらわす文字列を返す。
NOTE 関数呼出し Date(...) と、同じ引数を持つオブジェクト生成式 new
Date(...) は、等価ではない。
すべたの引数は選択的である; 供給された引数は受け付けるが、それ以外は無視される。文字列が生成され、式 (new Date()).toString() によるものと同様の結果が返される。
Date が new
式の一部として呼ばれる場合、それはコンストラクタである; 新規にオブジェクトを生成し、初期化する。
Date が 2 個から 7 個の引数で呼出されるとき、 year, month, (以下選択的に) date, hours, minutes, seconds , ms から、日付を算出する。
新規に構築されたオブジェクトの [[Prototype]] プロパティは、 Date.prototype (セクション 15.9.4.1) の初期値である、オリジナルの Date プロトタイプオブジェクトに設定される。
新規に構築されたオブジェクトの [[Class]] プロパティは、 "Date" に設定される。
新規に構築されたオブジェクトの [[Value]] プロパティは次のように設定される:
新規に構築されたオブジェクトの [[Prototype]] プロパティは、 Date.prototype (セクション 15.9.4.1) の初期値である、オリジナルの Date プロトタイプオブジェクトに設定される。
新規に構築されたオブジェクトの [[Class]] プロパティは、 "Date" に設定される。
新規に構築されたオブジェクトの [[Value]] プロパティは次のように設定される:
新規に構築されたオブジェクトの [[Prototype]] プロパティは、 Date.prototype (セクション 15.9.4.1) の初期値である、オリジナルの Date プロトタイプオブジェクトに設定される。
新規に構築されたオブジェクトの [[Class]] プロパティは、 "Date" に設定される。
新規に構築されたオブジェクトの [[Value]] プロパティは、現在時間 (UTC) に設定される。
Date コンストラクタの内部 [[Prototype]] プロパティの値は、 Function プロトタイプオブジェクト (セクション 15.3.4) である。
内部プロパティと length プロパティ (値は 7) の他に、 Date コンストラクタは次のプロパティを持つ。
Date.prototype の初期値は、 Date プロトタイプオブジェクト (セクション 15.9.5) である。
このプロパティは、属性 { DontEnum, DontDelete, ReadOnly } を持つ。
parse
関数は、引数に ToString 演算子を適用し、結果の文字列を日付として解析する; 数、その日に該当する UTC 時間値を返す。文字列は地方時、 UTC 時、他のタイムゾーンの時間のどれ解析されてもよく、文字列の内容に依存する。
個々のECMAScript 実装中で ミリ秒が 0 である Date オブジェクトを x とするならば、次の全ての式がその実装中で同じ数字を生成する。全ての参照付けられたプロパティが初期値を持つならば、 then all of the following expressions should produce the same numeric value in
that implementation, if
all the properties referenced have their initial values:
x.valueOf() Date.parse(x.toString()) Date.parse(x.toUTCString())
しかしながら、式
Date.parse(x.toLocaleString())
は前の3つの式と同じ数値の生成を要求されない。一般に、その実装の toString か toUTCString メソッドによって生成されえない文字列を与えられたときの Date.parse
に生成される値は、実装依存である。
UTC 関数が 2 個に満たない引数で呼出されたとき、振る舞いは実装依存である。 UTC 関数が 2 個から 7 個の引数で呼出されるとき、year, month, (以下選択的に) date, hours, minutes, seconds, ms から、日付を算出する。 次のステップが取られる:
UTC 関数のの length プロパティは 7 である。
NOTE UTC 関数は Date コンストラクタとは 2 つの点で異なる: Date オブジェクト生成としてではなく、数として時間値を返す。そして地方時でなく UTC で引数を解析する。
Date プロトタイプオブジェクトは、それ自身が値 NaN の Date オブジェクト ([[Class]] が "Date") である。
Date プロトタイプオブジェクトの内部 [[Prototype]] プロパティの値は、 Object プロトタイプオブジェクト (セクション 15.2.3.1) である。
この後の Date プロトタイプオブジェクトのプロパティである関数の説明において、フレーズ "この Date オブジェクト" は、関数呼出しの this
値であるオブジェクトを参照する。汎用的な関数はない; this
が内部 [[Class]] プロパティの値が "Date" であるオブジェクトではないならば、例外 TypeError を投げる。また、フレーズ "この時間値" は、この Date オブジェクトに表される時間の数値、すなわち、この Date オブジェクトの内部 [[Value]] プロパティの値を参照する。
Date.prototype.constructor の初期値は、組込み Date コンストラクタである。
この関数は文字列値を返す。文字列の内容は実装依存であるが、現在のタイムゾーンの、簡便で人間に読解可能な形式の Date の表現が意図される。
NOTE 任意の Date 値 d について、 Date.prototype.parse(d.toString
()) (セクション 15.9.4.2) の結果が d と等しいことが意図される。
この関数は文字列値を返す。文字列の内容は実装依存であるが、現在のタイムゾーンの、簡便で人間に読解可能な形式の Date の "date" 成分の表現が意図される。
この関数は文字列値を返す。文字列の内容は実装依存であるが、現在のタイムゾーンの、簡便で人間に読解可能な形式の Date の "time" 成分の表現が意図される。
この関数は文字列値を返す。文字列の内容は実装依存であるが、現在のタイムゾーンの、簡便で人間に読解可能な、ホスト環境の現在のロケールの慣習に該当する形式の Date の表現が意図される。
NOTE この関数の第一引数は、この標準の将来のバージョンで使用される可能性がある; 実装はこのパラメータを他の用途に使用しないことを推奨される。
この関数は文字列値を返す。文字列の内容は実装依存であるが、現在のタイムゾーンの、簡便で人間に読解可能な、ホスト環境の現在のロケールの慣習に該当する形式の Date の "date" 成分の表現が意図される。
NOTE この関数の第一引数は、この標準の将来のバージョンで使用される可能性がある; 実装はこのパラメータを他の用途に使用しないことを推奨される。
この関数は文字列値を返す。文字列の内容は実装依存であるが、現在のタイムゾーンの、簡便で人間に読解可能な、ホスト環境の現在のロケールの慣習に該当する形式の Date の "time" 成分の表現が意図される。
NOTE この関数の第一引数は、この標準の将来のバージョンで使用される可能性がある; 実装はこのパラメータを他の用途に使用しないことを推奨される。
valueOf
関数は、この時間値である数値を返す。
this
値が [[Class]] プロパティが "Date" のオブジェクトでないならば、 例外 TypeError を投げる。地方時と UTC 時の差を分で返す。
this
値が Date オブジェクトでないならば、 例外 TypeError を投げる。this
値の [[Value]] プロパティを Result(2) に設定する。this
値の [[Value]] プロパティの値 を返す。this
値の [[Value]] プロパティを TimeClip(Result(4)) に設定する。this
値の [[Value]] プロパティの値を返す。this
値の [[Value]] プロパティを TimeClip(Result(4)) に設定する。this
値の [[Value]] プロパティの値を返す。ms が指定されないならば、 ms に getMilliseconds( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを TimeClip(Result(5)) に設定する。this
値の [[Value]] プロパティの値を返す。setSeconds
メソッドの length プロパティは 2 である。
ms が指定されないならば、 ms に getUTCMilliseconds( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを TimeClip(Result(5)) に設定する。this
値の [[Value]] プロパティの値を返す。setUTCSeconds
メソッドの length プロパティは 2 である。
sec が指定されないならば、 sec に getSeconds( ) の値を指定されたように振舞う。
ms が指定されないならば、 ms に getMilliseconds( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを、 TimeClip(Result(6)) に設定する。this
値の [[Value]] プロパティの値を返す。setMinutes
メソッドの length プロパティは 3 である。
sec が指定されないならば、 sec に値 getUTCSeconds( ) の値を指定されたように振舞う。
ms が指定されないならば、 ms に値 getUTCMilliseconds( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを、 TimeClip(Result(6)) に設定する。this
値の [[Value]] プロパティの値を返す。setUTCMinutes
メソッドの length プロパティは 3 である。
min が指定されないならば、 min に getMinutes( ) の値を指定されたように振舞う。
sec が指定されないならば、 sec に getSeconds( ) の値を指定されたように振舞う。
ms が指定されないならば、 ms に getMilliseconds( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを、 TimeClip(Result(7)) に設定する。this
値の [[Value]] プロパティの値を返す。setHours
メソッドの length プロパティは 4 である。
min が指定されないならば、 min に getUTCMinutes( ) の値を指定されたように振舞う。
sec が指定されないならば、sec に getUTCSeconds( ) の値を指定されたように振舞う。
ms が指定されないならば、 ms に getUTCMilliseconds( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを、 TimeClip(Result(7)) に設定する。this
値の [[Value]] プロパティの値を返す。setUTCHours
メソッドの length プロパティは 4 である。
this
値の [[Value]] プロパティを、 TimeClip(Result(4)) に設定する。this
値の [[Value]] プロパティの値を返す。this
値の [[Value]] プロパティを、 TimeClip(Result(4)) に設定する。this
値の [[Value]] プロパティの値を返す。date が指定されないならば、 date に getDate( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを、 TimeClip(Result(5)) に設定する。this
値の [[Value]] プロパティの値を返す。setMonth
メソッドの length プロパティは 2 である。
date が指定されないならば、 date に getUTCDate( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを、 TimeClip(Result(5)) に設定する。this
値の [[Value]] プロパティの値を返す。setUTCMonth
メソッドの length プロパティは 2 である。
month が指定されないならば、 month に getMonth( ) の値を指定されたように振舞う。
date が指定されないならば、 date に getDate( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを、 TimeClip(Result(6)) に設定する。this
値の [[Value]] プロパティの値 を返す。setFullYear
メソッドの length プロパティは 3 である。
month が指定されないならば、 month に getUTCMonth( ) の値を指定されたように振舞う。
date が指定されないならば、 date に getUTCDate( ) の値を指定されたように振舞う。
this
値の [[Value]] プロパティを、 TimeClip(Result(6)) に設定する。this
値の [[Value]] プロパティの値を返す。setUTCFullYear
メソッドの length プロパティは 3 である。
この関数は文字列値を返す。文字列の内容は実装依存であるが、 UTC の、簡便で人間に読解可能な形式の Date の表現が意図される。
Date インスタンスは、 Date プロトタイプオブジェクトから継承したプロパティの上に、特にプロパティを持たない。