備忘録的プログラミングリファレンス

Date クラス

 Date クラスは、日付に関するオブジェクトのためのクラス定義です。以下のように new Date() で Date インスタンスを生成します。

Date インスタンスの生成
let time_ = new Date();

 Date() の引数に何も指定がない場合は現在の日時になります。

 引数を指定するとその日時で Date() インスタンスが生成されます。

Date インスタンスの生成
let time_ = new Date( 2023,7,23,12,20 );

 ミリ秒数で表示することもできます。

Date インスタンスをミリ秒で表示
console.log( now_.valueOf );	// 例えば、1690059335207 と表示される

 ブラウザーにおいて、JavaScript で new Date() によって現在の日時を取得するとユーザーの環境によって違う日時になります。タイムゾーンによっても変わってくるかもしれません。

 フォーム入力で日時を扱うときには協定世界時(UTC)を使用した方が都合がいい場合もあります。タイムゾーンが同じ環境では問題になりませんが、タイムゾーンをまたいだ環境でデータを収集する場合は問題になります。

 特にサーバー環境では UTC を利用するようにしたほうがよいかもしれません。

ページ内 Index

構文( Syntax )

 Date クラスは、日付に関するオブジェクトです。以下のように new Date() で Date インスタンスを生成します。

Date インスタンスの生成
let now_ = new Date();

 Date() の引数に何も指定がない場合は現在の日時になります。

Date インスタンスの表示
console.log( now_ );	// 例えば、Date Sun Jul 23 2023 05:55:35 GMT+0900 (日本標準時) と表示される

 ブラウザでは使用しているコンピュータに設定されたローカルの日時を基準にしています。
 サーバーでは 協定世界時( UTC )が基準になることがあります。

 引数を指定するとその日時で Date() インスタンスが生成されます。

Date インスタンスの生成
let time_ = new Date( 2023,7,23,12,20 );

 ミリ秒数で表示することもできます。

Date インスタンスをミリ秒で表示
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() メソッドを使用します。

JSON において数値を文字列に
const data = { now_ : new Date().valueOf() };
const json_data = JSON.stringify( data );

 ブラウザで受け取った文字列のミリ秒を数値型に変換するには parse() を使用します。

JSON において文字列を数値に
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 クラスのメソッドの動作を確認します。確認ボタンをクリックして実行してみてください。