【STEP.19】
JavaScriptの日付・時刻操作の方法をマスターしよう!

Dateオブジェクトとは

JavaScript標準のデータ型としてはdate型は存在しません。

しかし、組み込みオブジェクトのDateを利用すれば、日付を直感的に表現・操作できます。

Dateオブジェクトのメンバー一覧

Dateオブジェクトで利用可能なメンバーは、以下の通りです。

【Dateオブジェクトで利用可能なメンバー一覧(*は静的メソッド)】
分類メンバー概要
カル時刻/取得getFullYear()年(4桁)
getMonth()月(0~11)
getDate()日(0~31)
getDay()曜日(0:日曜~6:土曜)
getHours()時(0~23)
getMinutes()分(0~59)
getSeconds()秒(0~59)
getMilliseconds()ミリ秒(0~999)
getTime()1970/01/01 00:00:00からの経過ミリ秒
getTimezoneOffset()協定世界時との時差
カル時刻/設定setFullYear(y)年(4桁)
setMonth(m)月(0~11)
setDate(d)日(0~31)
setHours(h)時(0~23)
setMinutes(m)分(0~59)
setSeconds(s)秒(0~59)
setMilliseconds(ms)ミリ秒(0~999)
setTime(ts)1970/01/01 00:00:00からの経過ミリ秒
協定世界時/取得getUTCFullYear()年(4桁)
getUTCMonth()月(0~11)
getUTCDate()日(0~31)
getUTCDay()曜日(0:日曜~6:土曜)
getUTCHours()時(0~23)
getUTCMinutes()分(0~59)
getUTCSeconds()秒(0~59)
getUTCMilliseconds()ミリ秒(0~999)
協定世界時/設定setUTCFullYear(y)年(4桁)
setUTCMonth(m)月(0~11)
setUTCDate(d)日(0~31)
setUTCHours(h)時(0~23)
setUTCMinutes(m)分(0~59)
setUTCSeconds(s)秒(0~59)
setUTCMilliseconds(ms)ミリ秒(0~999)
文字列変換toUTCString()協定世界時を文字列として取得
toLocaleString()ローカル時を文字列として取得
toDateString()日付部分を文字列として取得
toTimeString()時刻部分を文字列として取得
toLocaleDateString()地域情報に従って、日付部分を文字列として取得
toLocaleTimeString()地域情報に従って、時刻部分を文字列として取得
toString()日時を文字列として取得
toJSON()日時をJSON文字列として取得
解析*parse(dat)日付文字列を解析し、1970/01/01 00:00:00からの経過ミリ秒を取得
*UTC(y,m,d[,h[,mm[,s[,ms]]]])日付情報をもとに1970/01/01 00:00:00からの経過ミリ秒を取得(協定世界時)
*now()協定世界時での現在の日付を、1970/01/01 00:00:00からの経過ミリ秒として取得

協定世界時(Coordinated Universal Time)とは、国際的な協定で決められている公式時刻のことです。

上の表からも、Dateオブジェクトでは、Dateオブジェクトの内容をローカル時刻と協定世界時として取得/設定するためのメソッドが、それぞれ提供されていることがわかります。

日付/時刻を設定する【Dateコンストラクター】

Dateオブジェクトには、他の文字列や配列などのようにリテラル表現は存在しないので、オブジェクトの生成には必ずコンストラクターを経由する必要があります。

Dateオブジェクトのコンストラクターには、以下の4つの構文があります。

let dat1 = new Date();
	
let dat2 = new Date('2020/01/16 12:34:56');

let dat3 = new Date(2020, 0, 16, 12, 34, 56, 999);

let dat4 = new Date(1579145696000);

まず、「let dat1 = new Date();」ではデフォルトのDateオブジェクトを生成します。

Dateオブジェクトは、デフォルトで、生成された時点でのシステムの日付をセットします。

let dat2 = new Date('2020/01/16 12:34:56');」は日付文字列をもとにDateオブジェクトを生成します。

ここでは、「2020/01/16 12:34:56」の形式で日付文字列を指定しています。

ほかにも「Thu Jan 16 2020 12:34:56」のような英文形式で指定することもできます。

年月日/時分秒/ミリ秒の形式で指定したい場合には、「let dat3 = new Date(2020, 0, 16, 12, 34, 56, 999);」の構文を利用します。

この場合、時分秒、ミリ秒は省略可能です。

また月は(1~12ではなく)0~11で指定する点に注意してください。

この他、1970/01/01 00:00:00からの経過ミリ秒(タイムスタンプ値)で指定する方法もあります。(let dat4 = new Date(1579145696000);

その時々の状況に応じて、それぞれの構文を使い分けると良いでしょう。

日付/時刻を個別に設定する【setXxxxx】

setXxxxxメソッドを利用することで、年月日、時分秒などの情報を個別に設定できます。

let local1 = new Date();

local1.setFullYear(2020);
local1.setMonth(0);
local1.setDate(16);
local1.setHours(12);
local1.setMinutes(34);
local1.setSeconds(56);
local1.setMilliseconds(999);

let local2 = new Date();
local2.setTime(1579145696000);

console.log(local1);
// 結果:Thu Jan 16 2020 12:34:56 GMT+0900 (日本標準時)

console.log(local2);
// 結果:Thu Jan 16 2020 12:34:56 GMT+0900 (日本標準時)

setUTCXxxxxメソッドは、日時を協定世界時(Coordinated Universal Time:UTC)として設定するためのメソッドです。

UTCは国際的な協定で決められた公式時刻のことで、かつてのグリニッジ標準時に代わって、世界標準時として使われています。

let utc = new Date();

utc.setUTCFullYear(2020);
utc.setUTCMonth(0);
utc.setUTCDate(16);
utc.setUTCHours(12);
utc.setUTCMinutes(34);
utc.setUTCSeconds(56);
utc.setUTCMilliseconds(999);

console.log(utc);
// 結果:Thu Jan 16 2020 21:34:56 GMT+0900 (日本標準時)

協定世界時の12時は、東京時間では21時になっている点に注目です。

日付/時刻を取得する【getXxxxx】

DateオブジェクトのgetXxxxxメソッドを利用します。

let date = new Date(2020, 0, 16, 12, 34, 56, 999);

console.log(date.getFullYear());
// 結果:2020
console.log(date.getMonth());
// 結果:0(1月)
console.log(date.getDate());
// 結果:16
console.log(date.getDay());
// 結果:4(木曜日)
console.log(date.getHours());
// 結果:12
console.log(date.getMinutes());
// 結果:34
console.log(date.getSeconds());
// 結果:56
console.log(date.getMilliseconds());
// 結果:999
console.log(date.getTime());
// 結果:1579145696999
console.log(date.getTimezoneOffset());
// 結果:-540

日時をUTC(協定世界時)として取得するgetUTCXxxxxメソッドもあります。

let date = new Date(2020, 0, 16, 12, 34, 56, 999);

console.log(date.getUTCFullYear());
// 結果:2020
console.log(date.getUTCMonth());
// 結果:0(1月)
console.log(date.getUTCDate());
// 結果:16
console.log(date.getUTCDay());
// 結果:4(木曜日)
console.log(date.getUTCHours());
// 結果:3
console.log(date.getUTCMinutes());
// 結果:34
console.log(date.getUTCSeconds());
// 結果:56
console.log(date.getUTCMilliseconds());
// 結果:999

getMonthgetUTCMonthメソッドは、いずれも現在の月を(1~12ではなく)0~11の値で返す点に注意する必要があります。

日付/時刻値を特定形式の文字列として取得する【toXxxxxString】

日付/時刻値を特定形式の文字列として取得したいならば、toXxxxxStringメソッドを利用します。

let date = new Date(2020, 0, 16, 12, 34, 56, 999);

console.log(date.toUTCString());
console.log(date.toLocaleString());
console.log(date.toDateString());
console.log(date.toTimeString());
console.log(date.toLocaleDateString());
console.log(date.toLocaleTimeString());
console.log(date.toString());
console.log(date.toJSON());
console.log(date.toISOString());
Thu, 16 Jan 2020 03:34:56 GMT
2020/1/16 12:34:56
Thu Jan 16 2020
12:34:56 GMT+0900 (日本標準時)
2020/1/16
12:34:56
Thu Jan 16 2020 12:34:56 GMT+0900 (日本標準時)
2020-01-16T03:34:56.999Z
2020-01-16T03:34:56.999Z

toLocaleXxxxxStringメソッドは、日付/時刻値を現在の地域情報に適した形式で返します。

プラットフォームの地域情報によって、結果は変化します。

toJSONメソッドはJSONでの利用を目的として、日付を文字列化するのに利用します。

内部的にはtoISOStringメソッドを利用しています。

タイムスタンプ値を取得する【getTime/parse/UTC/now】

日付文字列からタイムスタンプ値を取得するならば、getTimeメソッドを利用する方法以外にも、parseUTC静的メソッドを利用する方法もあります。

両者の違いは、parseメソッドが引数を文字列で渡すのに対して、UTCメソッドは年月日、時分秒で渡す点です。

console.log(Date.parse('2020-01-16'));
// 結果:1579132800000
console.log(Date.parse('2020-01-16T12:34:56'));
// 結果:1579145696000
console.log(Date.parse('2020-01-16T12:34:56+0900'));
// 結果:1579145696000
console.log(Date.parse('Thu 16 Jan 2020 12:34:56'));
// 結果:1579145696000
console.log(Date.UTC(2020, 0, 16, 12, 34, 56));
// 結果:1579178096000

同じく、現在日時のタイムスタンプ値を求めるnowメソッドもあります。

console.log(Date.now());
// 結果:1579145696999

日付/時刻を加算/減算する

Dateオブジェクトには、日付/時刻を直接加算/減算するためのメソッドは用意されていません。

そのため、getXxxxxメソッドで個々の日付・時刻要素を取り出し、加算/減算した結果をsetXxxxxメソッドで書き戻すという手順が必要となります。

具体的には、以下のコードを見てみましょう。

let date = new Date(2020, 0, 16, 12, 34, 56, 999);

console.log(date.toLocaleString());
// 結果:2020/1/16 12:34:56

date.setMonth(date.getMonth() + 10); // 10か月を加算

console.log(date.toLocaleString());
// 結果:2020/11/16 12:34:56

date.setDate(date.getDate() - 20); // 20日を減算

console.log(date.toLocaleString());
// 結果:2020/10/27 12:34:56

演算の結果が日付/時刻要素の有効な範囲を超えてしまった場合でも、Dateオブジェクトが正しい日付/時刻値に換算してくれます。(たとえば、12月の10か月後は22月ですが、Dateオブジェクトは翌年の10月と見なします。)

月末を求める

Dateオブジェクトの上記のような性質を利用することで、その月の最終日を求めることもできます。

具体例を見てみましょう。

let date = new Date(2020, 0, 16, 12, 34, 56, 999);

console.log(date.toLocaleString());
// 結果:2020/1/16 12:34:56

date.setMonth(date.getMonth() + 1); // 来月の・・・

date.setDate(0); // 0日目をセット

console.log(date.toLocaleString());
// 結果:2020/1/31 12:34:56

このように、「来月の0日目」はDateオブジェクトでは、今月の最終日として見なされるわけです。

日付/時刻の差を求める

Dateオブジェクトは、日付/時刻の差を直接求めるような機能を提供していないので、以下のようなコードを記述する必要があります。

let date1 = new Date(2020, 04, 15);

let date2 = new Date(2020, 05, 20);

let diff = (date2.getTime() - date1.getTime())/(1000*60*60*24)

console.log(diff + '日の差です。');

// 結果:36日の差です。

ここでは、「2020/06/20」と「2020/05/15」との日付差を計算しています。

日付差を求める場合に、まず必要となるのは、2つの日付の経過ミリ秒です。

経過ミリ秒を取得するのはgetTimeメソッドの役割です。

ここでは、経過ミリ秒の差を求め、その値をもう一度、日付に変換しています。

経過ミリ秒を日付に変換するには、以下のようにします。

経過ミリ秒,差分,変換,1000ミリ秒*60秒*60分*24時間


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です