GitBookjs-primerDateこの章では、JavaScriptで日付や時刻を扱うためのDateについて学びます。DateオブジェクトDateオブジェクトはStringやArrayなどと同じく、ECMAScriptで定義されたビルトインオブジェクトです。Dateオブジェクトをインスタンス化することで、ある特定の時刻を表すオブジェクトが得られます。Dateにおける「時刻」は、UTC(協定世界時)の1970年1月1日0時0分0秒を基準とした相対的なミリ秒として保持されます。このミリ秒の値のことを、本章では「時刻値」と呼びます。Dateオブジェクトのインスタンスはそれぞれがひとつの時刻値を持ち、その時刻値を元に日付や時・分などを扱うメソッドを提供します。インスタンスの作成Dateオブジェクトのインスタンスは、常にnew演算子を使って作成します。Dateオブジェクトのインスタンス作成には、大きく分けて2つの種類があります。1つは現在の時刻をインスタンス化するもの、もう1つは任意の時刻をインスタンス化するものです。現在の時刻をインスタンス化するDateをnewするときにコンストラクタ引数を何も渡さない場合、作成されるインスタンスは現在の時刻を表すものになります。Dateオブジェクトのインスタンスではなく現在の時刻の時刻値だけが欲しい場合には、Date.nowメソッドの戻り値を使います。作成したインスタンスが持つ時刻値は、getTimeメソッドで取得できます。8601形式の文字列に変換できます。8601とは国際規格となっている文字列の形式で、2006-01-02T15:04:05.999+09:00のように時刻を表現します。人間が見てもわかりやすい文字列であるため、広く利用されています。8601形式の文字列で表示するconsole.log(now.toISOString());任意の時刻をインスタンス化するコンストラクタ引数を渡すことで、任意の時刻を表すインスタンスを作成できます。Dateのコンストラクタ関数は渡すデータ型や引数によって時刻の指定方法が変わります。Dateは次の3種類を引数としてサポートしています。時刻値を渡すもの時刻を示す文字列を渡すもの時刻の部分(年・月・日など)をそれぞれ数値で渡すもの1つめは、コンストラクタ関数にミリ秒を表す数値型の引数を渡したときに適用されます。渡した数値をUTCの1970年1月1日0時0分0秒を基準とした時刻値として扱います。この方法は実行環境による挙動の違いが起きないので安全です。時刻値を直接指定するので、他の2つの方法と違ってタイムゾーンを考慮する必要がありません。"2006-01-02T15:04:05.999Z"2つめは文字列型の引数を渡したときに適用されます。その文字列をパースして得られる時刻値を使って、Dateのインスタンスを作成します。8601形式の文字列を渡してDateのインスタンスを作成します。タイムゾーンを含む文字列の場合は、そのタイムゾーンにおける時刻として時刻値を計算します。文字列からタイムゾーンが読み取れない場合は、実行環境のタイムゾーンによって時刻値を計算するため注意が必要です。8601形式以外の文字列のパースは、ブラウザごとに異なる結果を返す可能性があるため注意しましょう。(Asia/Tokyoの場合)3つめは、時刻を次のように、年・月・日などの部分ごとの数値で指定する方法です。milliseconds);コンストラクタ関数に2つ以上の引数を渡すと、このオーバーロードが適用されます。日を表す第三引数から後ろの引数は省略可能ですが、日付だけはデフォルトで1が設定され、そのほかには0が設定されます。月を表す第二引数は0から11までの数値で指定することにも注意しましょう。先述した2つの方法と違い、この方法はタイムゾーンを指定できません。渡した数値は常にローカルのタイムゾーンにおける時刻とみなされます。結果が実行環境に依存してしまうため、基本的にこの方法は使うべきではありません。時刻を部分ごとに指定したい場合は、Date.UTCメソッドを使うとよいでしょう。渡す引数の形式は同じですが、Date.UTCメソッドは渡された数値をUTCにおける時刻として扱い、その時刻値を返します。"2006-01-02T15:04:05.999Z"なお、どのオーバーロードにも当てはまらない引数や、時刻としてパースできない文字列を渡した際にも、Dateのインスタンスは作成されます。Dateという文字列を返します。ほとんどはgetHoursとsetHoursのような、時刻の各部分を取得・更新するためのメソッドです。次の例は、日付を決まった形式の文字列に変換しています。getMonthメソッドやsetMonthメソッドのように月を数値で扱うメソッドは、0から11の数値で指定することに注意しましょう。あるDateのインスタンスの時刻が何月かを表示するには、getMonthメソッドの戻り値に1を足す必要があります。"2006/01/02"getTimezoneOffsetメソッドは、実行環境のタイムゾーンのUTCからのオフセット値を分単位の数値で返します。Asia/TokyoタイムゾーンはUTC+9時間なのでオフセット値は-9時間となり、getTimezoneOffsetメソッドの戻り値は-540です。多くのユースケースにおいては機能が不十分です。次のような場合に、Dateでは直感的に記述できません。任意の書式の文字列から時刻に変換するメソッドがない「時刻を1時間進める」のように時刻を前後にずらす操作を提供するメソッドがない任意のタイムゾーンにおける時刻を計算するメソッドがないYYYY/MM/DDのようなフォーマットに基づいた文字列への変換を提供するメソッドがないそのため、JavaScriptにおける日付・時刻の処理は、標準のDateではなくライブラリを使うことが一般的になっています。代表的なライブラリとしては、moment.jsやjs-joda、date-fnsなどがあります。formatメソッドで任意の書式の文字列に変換するconsole.log(future.format("YYYY/MM/DD"));まとめこの章では、Dateオブジェクトについて学びました。Dateオブジェクトのインスタンスはある特定の時刻を表すビルトインオブジェクトDateにおける「時刻」は、UTC(協定世界時)の1970年1月1日0時0分0秒を基準とした相対的なミリ秒として保持されているDateコンストラクタで任意の時間を表すDateインスタンスを作成できるDateインスタンスメソッドにはさまざまなものがあるが、現実のユースケースでは機能が不十分になりやすいビルトインオブジェクトのDateのみではなく、ライブラリも合わせて利用するのが。