Date クラス
Date クラスは、日付に関するオブジェクトのためのクラス定義です。以下のように
で Date インスタンスを生成します。new Date()
let time_ = new Date();
Date() の引数に何も指定がない場合は現在の日時
になります。
引数を指定するとその日時で Date() インスタンスが生成されます。
let time_ = new Date( 2023,7,23,12,20 );
ミリ秒数で表示することもできます。
console.log( now_.valueOf ); // 例えば、1690059335207 と表示される
ブラウザーにおいて、JavaScript で new Date()
によって現在の日時を取得するとユーザーの環境によって違う日時になります。タイムゾーンによっても変わってくるかもしれません。
フォーム入力で日時を扱うときには協定世界時(UTC)を使用した方が都合がいい場合もあります。タイムゾーンが同じ環境では問題になりませんが、タイムゾーンをまたいだ環境でデータを収集する場合は問題になります。
特にサーバー環境では UTC を利用するようにしたほうがよいかもしれません。
構文( Syntax )
Date クラスは、日付に関するオブジェクトです。以下のように new Date()
で Date インスタンスを生成します。
let now_ = new Date();
Date() の引数に何も指定がない場合は現在の日時になります。
console.log( now_ ); // 例えば、Date Sun Jul 23 2023 05:55:35 GMT+0900 (日本標準時) と表示される
ブラウザでは使用しているコンピュータに設定されたローカルの日時を基準にしています。
サーバーでは 協定世界時( UTC )が基準になることがあります。
引数を指定するとその日時で Date() インスタンスが生成されます。
let time_ = new Date( 2023,7,23,12,20 );
ミリ秒数で表示することもできます。
console.log( now_.valueOf ); // 例えば、1690059335207 と表示される
JavaScript の日時はミリ秒で計算しています。ミリ秒数の基準は 1970 年 1 月 1 日 00 : 00 : 00 でこの日時を 0 としています。
たとえば、現在日時は基準の日時からの経過ミリ秒数を足して計算しています。1970 年 1 月 1 日 00 : 00 : 00 より前はマイナスで計算しています。
タイムゾーンによってことなる日時や指定日時もミリ秒の差分によって計算しています。
プロパティ( Property )
Date クラスには以下の静的プロパティのみがあります。
静的プロパティ
静的プロパティ | 概要 |
---|---|
Date.now() | 1970 年 1 月 1 日 00 : 00 : 00 から現日時までの経過したミリ秒数 |
Date.parse() | 引数が必要。1970 年 1 月 1 日 00 : 00 : 00 から引数で指定された日時までの経過したミリ秒数 |
Date.UTC() | 引数が必要。1970 年 1 月 1 日 00 : 00 : 00 ( UTC )から引数で指定された日時までの経過したミリ秒数 |
メソッド(Method)
静的プロパティ | 概要 |
---|---|
取得と設定 | |
.getDate() | 日にち( 1–31 )を返す。ローケル |
.getDay() | 曜日( 0–6 )を返す。ローケル |
.getFullYear() | 4桁の年度を返す。ローケル |
.getHours() | 何時か( 0–23 )を返す。ローケル |
.getMilliseconds() | ミリ秒( 0–999 )を返す。ローケル |
.getMinutes() | 何分か( 0–59 )で返す。ローケル |
.getMonth() | 月度( 0–11 )を返す。ローケル |
.getSeconds() | 何秒( 0–59 )かを返す。ローケル |
.getTime() | 指定された日時から1970 年 1 月 1 日 00 : 00 : 00 ( UTC )からの経過ミリ秒を返す |
.getTimezoneOffset() | ローカルとUTCのタイムゾーンの差分を(分)で返す。ローカルを基準にUTCとなる |
.setDate() | 日にちを設定。ミリ秒で返す |
.setFullYear() | 4桁の年度を設定 |
.setHours() | 何時か( 0–23 )を設定 |
.setMilliseconds() | ミリ秒( 0–999 )を設定 |
.setMinutes() | 何分か( 0–59 )を設定 |
.setMonth() | 月度( 0–11 )を設定 |
.setSeconds() | 何秒か( 0–59 )を設定 |
.setTime() | 1970 年 1 月 1 日 00 : 00 : 00 ( UTC )からの経過ミリ秒で設定 |
.setUTCDate() | UTC での日にちを設定。ミリ秒で返す |
.setUTCFullYear() | UTC での4桁の年度を設定 |
.setUTCHours() | UTC での何時か( 0–23 )を設定 |
.setUTCMilliseconds() | UTC でのミリ秒( 0–999 )を設定 |
.setUTCMinutes() | UTC での何分か( 0–59 )を設定 |
.setUTCMonth() | UTC での月度( 0–11 )を設定 |
.setUTCSeconds() | UTC での何秒か( 0–59 )を設定 |
.valueOf() | ミリ秒数で表示 |
UTC | |
.getUTCDate() | UTC での日にち( 1–31 )を返す |
.getUTCDay() | UTC での曜日( 0–6 )を返す |
.getUTCFullYear() | UTC での4桁の年度を返す |
.getUTCHours() | UTC での何時か( 0–23 )を返す |
.getUTCMilliseconds() | UTC でのミリ秒( 0–999 )を返す |
.getUTCMinutes() | UTC での何分か( 0–59 )で返す |
.getUTCMonth() | UTC での月度( 0–11 )を返す |
.getUTCSeconds() | UTC での何秒( 0–59 )かを返す |
.toUTCString() | UTC での日時を文字列に変換 |
文字列に変換 | |
.toDateString() | 日付のみを文字列に変換 |
.toISOString() | ISO 8601 Extended Format に準じた文字列に変換 |
.toJSON() | JSON で解釈できる文字列に変換。ISO 8601 Extended Format。JSON.stringify() よりもこちらを使う |
.toLocaleDateString() | 日にちのみをローカルの地域性に基づいた表現に変換。ただし、システムの設定による |
.toLocaleString() | 日時をローカルの地域性に基づいた表現に変換 |
.toLocaleTimeString() | 時刻のみをローカルの地域性に基づいた表現に変換 |
.toString() | 指定された表現に変換 |
.toTimeString() | 時刻のみを文字列に変換 |
協定世界時( UTC )とサーバー
協定世界時( UTC )
協定世界時( UTC )とは Coordinated Universal Time の略で、世界中のコンピュータが基準にしている日時のことです。世界中のどこからでも UTC では同じ時刻を返します。
協定世界時( UTC )ではミリ秒で表され、0 は 1970 年 1 月 1 日 00 : 00 : 00 です。現在時刻は 1970 年 1 月 1 日 00 : 00 : 00 からの経過ミリ秒で表します。
1970 年 1 月 1 日 00 : 00 : 00 を UNIX エポック
といいます。
タイムゾーンによる日時の違いはこのUNIX エポック
からのミリ秒の差分で計算します。閏年やサマータイムもミリ秒の差分によって計算します。
この説での解説はサーバーにおける日時の注意点です。Node.js などで日時のやり取りを行う場合には必要な知識になります
サーバーによる日時
ブラウザ内で日時の扱いが完結するなら問題になりませんが、サーバーとブラウザで日時をやり取りする場合は問題になるかもしれません。
ブラウザで JavaScript によって取得できる日時はユーザーの環境に大きく依存しています。それがサーバーの日時と必ずしも一致するとは限りません。
サーバーから日時をブラウザに渡せば、扱う日時は常に統一することができます。しかし、ここで問題があります。サーバーからブラウザに日時を渡す方法には文字列である場合です。
ほとんどの場合、サーバーからブラウザに渡されるデータはテキスト形式で渡します。日時は
と渡すよりミリ秒で渡した方がよりスムーズです。Mon Jul 24 2023 23:23:58 GMT+0900 (日本標準時)
let now_ = new Date().valueOf().toString();
// now_ ではミリ秒の文字列
戻す時は数値に変換
let now_number = now_ + 0;
サーバーとブラウザでデータをやり取りする場合に JSON を使うことがあります。
JSON で数値を文字列に変換するには stringify() メソッドを使用します。
const data = { now_ : new Date().valueOf() };
const json_data = JSON.stringify( data );
ブラウザで受け取った文字列のミリ秒を数値型に変換するには parse() を使用します。
const data = JSON.parse( json_data );
const now_ = new Date( data.now_ );
日時の計算、比較、ソート
Date インスタンスは基本的にミリ秒で計算します。ミリ秒に変換することで日時は四則計算や比較、ソートすることができます。
日時の四則計算
Date インスタンスは四則計算できます。例えば、1970 年 4 月 3 日から今日まで何日経ったかを計算するには以下のようにします。
const date_a = new Date(); // Tue Jul 25 2023 07:56:46 GMT+0900 (日本標準時) const date_b = new Date( 1970, 4, 3 ); const past_sec = date_a - date_b; // ミリ秒 1679730453247 const days = past_sec/1000/60/60/24; // 何日 19441.324690358797 console.log( days );
何日後は以下のように計算します。
const date_a = new Date(); // Tue Jul 25 2023 07:56:46 GMT+0900 (日本標準時) const days = 100; // 100 日後 const sec = days * 24 * 60 * 60 * 1000; // ミリ秒 const date_b = new Date( date_a.valueOf() + sec ); // 何日後 Thu Nov 02 2023 07:55:10 GMT+0900 (日本標準時) console.log( date_b );
日時の比較
Date インスタンスは比較することができます。
const date_a = new Date(); // Tue Jul 25 2023 07:56:46 GMT+0900 (日本標準時) const date_b = new Date( 1970, 4, 3 ); console.log( date_a > date_b ); // true
日時のソート
Date インスタンスの配列はミリ秒に変換することで sort() によってソートすることができます。
let days_sec = []; days_sec[ days_sec.length ] = new Date(); // Tue Jul 25 2023 08:07:32 GMT+0900 (日本標準時) days_sec[ days_sec.length ] = new Date( 2022, 10, 1 ); days_sec[ days_sec.length ] = new Date( 2023, 7, 10 ); console.log( days_sec ); // Tue Jul 25 2023 08:07:32 GMT+0900 (日本標準時),Tue Nov 01 2022 00:00:00 GMT+0900 (日本標準時),Thu Aug 10 2023 00:00:00 GMT+0900 (日本標準時) days_sec.sort( (a,b) => b - a ); // 降順 console.log( days_sec ); // Thu Aug 10 2023 00:00:00 GMT+0900 (日本標準時),Tue Jul 25 2023 08:07:32 GMT+0900 (日本標準時),Tue Nov 01 2022 00:00:00 GMT+0900 (日本標準時) days_sec.sort( (a,b) => a - b ); // 昇順 console.log( days_sec ); // Tue Nov 01 2022 00:00:00 GMT+0900 (日本標準時),Tue Jul 25 2023 08:07:32 GMT+0900 (日本標準時),Thu Aug 10 2023 00:00:00 GMT+0900 (日本標準時)
Example
Date クラスのメソッドの動作を確認します。確認
ボタンをクリックして実行してみてください。