Code Journey

30代未経験からプログラミング挑戦中(追うものは追われる者に勝る)

JavaScriptで日付・時刻・曜日を扱う方法【Dateオブジェクト】

はじめに

前提

まず前提として、この記事を書いているのは未経験からプログラミングに挑戦中の者になります。学習はフィヨルドブートキャンプに参加しながら取り組んでいて、現役のエンジニアの方からレビューをもらいながら進めています。

現在の学習状況は以下を随時更新しているので興味ある方はご覧ください。

hirano-vm4.hatenablog.com

筆者は執筆時点で、RubyRuby on Rails)のプラクティスが終わったあとにJavaScriptに取り組んでいるので、完全に0からではありません。JavaScriptを多言語から学ぶにあたって、まず覚えるべき要点をまとめました。

詳しい解説ではなく要点をまとめた学習記録・ノートになりますのでご注意ください。

記事の本体は以下にになります。長くなってしまったので別記事として書いているものとなります。ご注意ください。

hirano-vm4.hatenablog.com

Dateオブジェクト

JavaScriptにはDateオブジェクトが用意されている。日付や時刻を扱うことができる。 インスタンスを作成すると特定の日時を表す値を持つ(この値は内部的には 1970 年 1 月 1 日 0 時 0 分 0 秒 UTC からの経過ミリ秒という形式で保管されている)。

developer.mozilla.org

Dateオブジェクトのインスタンスを作成

Dateオブジェクトのコンストラクタの種類

Dateオブジェクトのインスタンスを作成するにはコンストラクタを使用する。4種類のコンストラクタがしようできる。

現在日時のDateオブジェクトのインスタンスを作成

引数を指定せずに Date オブジェクトのインスタンスを作成すると、現在の日時の値を持つインスタンスを作成する。

new Date()

let d = new Date();

console.log(d.toString());
// Tue Nov 07 2023 21:18:56 GMT+0900 (日本標準時)

console.log(d.toUTCString());
// Tue, 07 Nov 2023 12:18:56 GMT

経過ミリ秒を指定してDateオブジェクトのインスタンスを作成

基準日時 1970 年 1 月 1 日 0 時 0 分 0 秒 UTC からの経過ミリ秒を指定して Date オブジェクトのインスタンスを作成する。 new Date(経過ミリ秒数)

  • 引数に指定した基準日時からの経過ミリ秒数で表される日時の値を持つ Date オブジェクトのインスタンスを作成する
  • このコンストラクタでは UTC からの経過ミリ秒で日時を指定するため、タイムゾーンについて考慮する必要がない
let day = new Date(10000);
console.log(day.toUTCString());
// Thu, 01 Jan 1970 00:00:10 GMT
日時を表す文字列を指定してDateオブジェクトのインスタンスを作成

日時を表す文字列を指定して Date オブジェクトのインスタンスを作成する。タイムゾーンを指定しなかった場合は、ローカルの環境で設定されているタイムゾーンでの日時が指定されたものとをして扱われる。

new Date(日付と時刻を表す文字列)

let d1 = new Date("2023-11-07T21:48:15");
console.log(d1.toString());
// Tue Nov 07 2023 21:48:15 GMT+0900 (日本標準時)

let d2 = new Date("2023-11-07");
console.log(d2.toString());
// Tue Nov 07 2023 09:00:00 GMT+0900 (日本標準時)

let d3 = new Date("2023-11-07T21:48:15Z");
console.log(d3.toString());
console.log(d3);
// Wed Nov 08 2023 06:48:15 GMT+0900 (日本標準時)
// 2023-11-07T21:48:15.000Z

年/分などを数値で指定してDateオブジェクトのインスタンスを作成

年、月、日、時、分、秒、ミリ秒の数値を指定してDateオブジェクトを作成する。 new Date(年, 月 [, 日 [, 時 [, 分 [, 秒 [, ミリ秒]]]]])

  • 年と月については必須の項目(それ以外は省略できる:省略した場合、日は 1 に、それ以外の 時、分、秒、ミリ秒は 0 が設定される)
  • 年は 4 桁or2 桁で指定(2 桁で指定した場合は 1900 + 年 となる)
  • 月は 0 から 11 の値で指定(1月が0、12月が11)
  • 年月だけで日付を指定しないと1日になる
let d1 = new Date(2023, 11);
console.log(d1.toString());
// Fri Dec 01 2023 00:00:00 GMT+0900 (日本標準時) 日付はしていないと1日になる

let d2 = new Date(10, 11, 31);
console.log(d2.toString());
// at Dec 31 1910 00:00:00 GMT+0900 (日本標準時) 11は12月を指す

let d3 = new Date(2023, 7, 31, 12, 30, 1, 110);
console.log(d3.toString());
// Thu Aug 31 2023 12:30:01 GMT+0900 (日本標準時)

コンストラクタをnew演算子をつけずに呼びだした場合

現在の日時を表す文字列を返す

let today = Date();
console.log(today.toString());
// Tue Nov 07 2023 21:44:14 GMT+0900 (日本標準時)

Dateオブジェクトの値を文字列で取得

日付と時刻を文字列として取得する(toString)

  • toString メソッドは、 Date オブジェクトが持つ日付と時刻の値を文字列として返す
  • タイムゾーンはローカルの環境で設定されているタイムゾーンが使用される

Dateオブジェクト.toString()

let today = new Date();
console.log(today.toString());
// Tue Nov 07 2023 21:44:14 GMT+0900 (日本標準時)

日付を文字列として取得する(toDateString)

  • toDateStringメソッドは、Dateオブジェクトが持つ日付の値を文字列として返す Dateオブジェクト.toDateString()
let today = new Date();
console.log(today.toDateString());
// Tue Nov 07 2023

時間は表示されなくなる。

時刻を文字列として取得(toTimeString)

  • toTimeString メソッドは、Dateオブジェクトが持つ時刻の値を文字列として返す
let today = new Date();
console.log(today.toTimeString());
// 21:54:12 GMT+0900 (日本標準時)

時間だけが返ってくる。

UTCタイムゾーンとして日付と時刻を文字列として取得(toUTCString)

  • toUTCString メソッドは、Dateオブジェクトが持つ日付と時刻の値を文字列として返す
  • タイムゾーンUTC が使用される
let today = new Date();
console.log(today.toUTCString());
// Tue, 07 Nov 2023 12:57:48 GMT

UTCタイムゾーンとして日付と時刻(ミリ秒含)を文字列として取得(toJSON)

  • toJSON メソッドは、Dateオブジェクトが持つ日付と時刻の値を文字列として返す
  • タイムゾーンUTC
let today = new Date();
console.log(today.toJSON());
// 2023-11-07T12:59:36.326Z

Dateオブジェクトの値を指定のロケール形式にした文字列で取得

日付と時刻を指定したロケールの形式で文字列として取得(toLocaleString)

  • toLocaleString メソッドは、Date オブジェクトが持つ日付と時刻の値を文字列として返す
  • ロケールを省略した場合はブラウザに設定されているロケールを使用

Dateオブジェクト.toLocaleString([ロケール[, オプション]])

let today = new Date();

console.log(today.toLocaleString("en-US"));
// 11/7/2023, 10:02:57 PM

console.log(today.toLocaleString("ja-JP"));
// 2023/11/7 22:02:57

console.log(today.toLocaleString());
// 2023/11/7 22:02:57 指定しないとローカルの設定と同じ

日付を指定したロケールの形式で文字列として取得(toLocaleDateString)

  • toLocaleDateString メソッドは、Dateオブジェクトが持つ日付の値を文字列として返す こちらは時間はなく年月日のみ
  • ロケールを省略した場合はブラウザに設定されているロケールを使用

Dateオブジェクト.toLocaleDateString([ロケール[, オプション]])

let today = new Date();

console.log(today.toLocaleDateString("en-US"));
// 11/7/2023
console.log(today.toLocaleDateString("ja-JP"));
// 2023/11/7

console.log(today.toLocaleDateString());
// 2023/11/7 指定しないとローカルの設定と同じ

時刻を指定したロケールの形式で文字列として取得(toLocaleTimeString)

  • toLocaleTimeString メソッドは、Dateオブジェクトが持つ時刻の値を文字列として返す こちらは時間のみ
  • ロケールを省略した場合はブラウザに設定されているロケールを使用

Dateオブジェクト.toLocaleTimeString([ロケール[, オプション]])

let today = new Date();

console.log(today.toLocaleTimeString("en-US"));
// 10:02:57 PM

console.log(today.toLocaleTimeString("ja-JP"));
// 22:02:57

console.log(today.toLocaleTimeString());
// 22:02:57 指定しないとローカルの設定と同じ

Dateオブジェクトの値を基準時間からの経過ミリ秒の値で取得

日付と時刻を経過ミリ秒の値として取得(getTime)

  • getTime メソッドは、Date オブジェクトが持つ日付と時刻の値を基準日時からの経過ミリ秒の値として返す

Dateオブジェクト.getTime()

let day = new Date(2000);

console.log(day.getTime());
// 2000 基準時間からの経過ミリ秒を取得

let today = new Date();

console.log(today.getTime());
// 1699362959811 Date オブジェクトが持つ日付と時刻の情報を基準時間からの経過秒数の値として取得

曜日を取得

  • Javascriptを使って曜日を取得するには、Dateオブジェクトに対してgetDay()メソッドを使う Dateオブジェクト.getDay())
  • getDay()メソッドはその曜日に応じて “0〜6” の数値を返す
  • 0を日曜日で、6は土曜日となる
曜日
日曜日 0
月曜日 1
火曜日 2
水曜日 3
木曜日 4
金曜日 5
土曜日 6

なので配列で各曜日の文字列を作って置き換える作業が必要になる。

const days = [
  "日曜日",
  "月曜日",
  "火曜日",
  "水曜日",
  "木曜日",
  "金曜日",
  "土曜日",
];
const today = new Date();

console.log(days[today.getDay()]);

// 火曜日(実行した曜日が表示される)

日付と時刻の値を取得するメソッドの一覧

Date オブジェクトが持つ値から以下のメソッドを使って様々な値を限定して取得することができる(ローカルの環境で設定されているタイムゾーンが使用される)。

各メソッドのgetあとにUTCをつけるとUTCタイムゾーンの値も取得可能(例:getUTCDay

メソッド 動作
getFullYear 年の値を取得する
getMonth 月の値を取得する
getDate 日の値を取得する
getHours 時の値を取得する
getMinutes 分の値を取得する
getSeconds 秒の値を取得する
getMilliseconds ミリ秒の値を取得する

月の値を取得する(getMonth)

  • Date オブジェクトが持つ日付と時刻の値からローカルのタイムゾーンでの「年」の値を数値で返す
  • 月の値を 0 から 11 の数値で返します。 0 が 1 月、 1 が 2月、 11 が 12 月に相当ので注意 Dateオブジェクト.getFullYear()

日の値を取得する(getDate)

  • Date オブジェクトが持つ日付と時刻の値からローカルのタイムゾーンでの「日」の値を数値で返す

Dateオブジェクト.getDate()

時の値を取得する(getHours)

  • Date オブジェクトが持つ日付と時刻の値からローカルのタイムゾーンでの「時」の値を数値で返す
  • 時の値を 0 から 23 までの数値で返す Dateオブジェクト.getHours()

分の値を取得する(getMinutes)

  • Date オブジェクトが持つ日付と時刻の値からローカルのタイムゾーンでの「分」の値を数値で返す

Dateオブジェクト.getMinutes()

秒の値を取得する(getSeconds)

  • Date オブジェクトが持つ日付と時刻の値からローカルのタイムゾーンでの「秒」の値を数値で返す Dateオブジェクト.getSeconds()

ミリ秒の値を取得する(getMilliseconds)

  • Date オブジェクトが持つ日付と時刻の値からローカルのタイムゾーンでの「ミリ秒」の値を数値で返す Dateオブジェクト.getMilliseconds()

月の初日(1日)と月末の日にちを取得する

月(コード実行日の属する月)の初日の場合

let today = new Date();

let firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(),1);

まず、new Date()で実行したその時のDateオブジェクトを作成し変数に入れる。その変数を使って新しいDateオブジェクトを作成する。

引数に(today.getFullYear(), today.getMonth(),1)とすることでその日の年・月が入る。月初めは常に1日なので1が入る。月に関しては1月が0になるので、表示上は+1する必要がある

月(コード実行日の属する月)の最終日の場合

上記と同じ容量で引数の日にちの部分を0とすることで最終日が取得できる。ただし0とすると前月の末日が表示されるため、今月の場合は月に+1、翌月の場合は月に+2する必要がある。

前月の最終日
let today = new Date();

let lastDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 0) 

// Tue Oct 31 2023 00:00:00 GMT+0900 (日本標準時)
今月の最終日
let today = new Date();

let lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0) 

// Thu Nov 30 2023 00:00:00 GMT+0900 (日本標準時)
翌月の最終日
let today = new Date();

let lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 2, 0) 

// Sun Dec 31 2023 00:00:00 GMT+0900 (日本標準時)

Dateオブジェクトの値に年、月、分、秒などの新しい値を設定

Date オブジェクトが持つ値に対して日付と時刻の値をそれぞれ設定するメソッドが用意されている。

日付と時刻の値を設定するメソッド一覧

各メソッドのgetの後にUTCをつけると、UTCタイムゾーンで設定され(例:setUTCFullYear)、そうでない場合はローカル環境に設定されているタイムゾーンとなる。

メソッド 動作
setFullYear 年の値を設定する
setMonth 月の値を設定する
setDate 日の値を設定する
setHours 時の値を設定する
setMinutes 分の値を設定する
setSeconds 秒の値を設定する
setMilliseconds ミリ秒の値を設定する

let today = new Date();
console.log(today.toString());
// Tue Nov 07 2023 23:18:39 GMT+0900 (日本標準時)

today.setFullYear(2000);
console.log(today.toString());
// Tue Nov 07 2000 23:18:39 GMT+0900 (日本標準時) 年だけ変わっている

today.setFullYear(1999, 11, 20);
console.log(today.toString());
// Mon Dec 20 1999 23:18:39 GMT+0900 (日本標準時)

秒だけ、日にちだけなどに合わせてメソッドを使い分ける。

ローカルとUTCタイムゾーンの差を取得する(getTimezoneOffset)

let today = new Date();
console.log(today.toString());
// Tue Nov 07 2023 23:24:05 GMT+0900 (日本標準時)

console.log(today.getTimezoneOffset());
// -540

Dateオブジェクト.getTimezoneOffset()