概要:JavaScriptで日付/時刻を扱うときの考え方
- JavaScript には「日付型」そのものはなく、日付・時刻を扱うには
Dateオブジェクト を使います。 Dateオブジェクトは、内部的には 1970年1月1日 00:00:00 UTC(協定世界時)からの経過ミリ秒数 を保持しています。これを「タイムスタンプ(ミリ秒)」と呼びます。- 表示・操作をするときには、内部のタイムスタンプをもとにして、ローカルタイム(ユーザー環境のタイムゾーン)や UTC(世界標準時)での解釈を行います。
Date オブジェクトの生成(作り方)
Date オブジェクトを生成する方法は複数あります。主なものを順に見ていきます。
| 生成方法 | 使い方 | 意味・補足 |
|---|---|---|
| 引数なし | new Date() | 現在の日時を表す Date オブジェクトを作ります。 |
| タイムスタンプ(ミリ秒) | new Date(時間のミリ秒) | 1970年1月1日 UTC からの経過ミリ秒を指定して日時を作ります。 |
| 日付文字列 | new Date("2025-10-13") や new Date("2025-10-13T15:30:00") など | 文字列をパースして日時を生成します。ただし、文字列フォーマットの互換性に注意が必要です。 |
| 年月日(+時分秒ミリ秒) | new Date(2025, 9, 13, 15, 30, 0) | 各要素を直接指定して日時を作ります。ただし、月は 0 が 1月、11 が 12月 という形式(月インデックスが 0始まり)で指定します。 |
補足:もし少ない引数しか渡さなかったら、欠けている部分には「その最小値(通常 0 や 1)」が補われます。たとえば、
new Date(2025, 9)は 2025年10月1日 00:00:00 を表します。
また、Date() を new を付けずに呼び出す と、Date オブジェクトそのものではなく、現在日時を表す文字列が返されます。
日付・時刻の取得と設定(get/set メソッド)
生成した Date オブジェクトから、日付や時刻の各部分を取り出したり、後から書き換えたりできます。これらは「get 系」「set 系」のメソッドで扱います。MDNウェブドキュメント+2GitHub+2
get 系メソッド(取得)
主なものを以下に挙げます(ローカル時刻基準のもの):
| メソッド | 返す値 | 範囲・補足 |
|---|---|---|
getFullYear() | 年(例:2025) | 4桁年を返します。 |
getMonth() | 月(0〜11) | 0 が 1月、11 が 12月。 |
getDate() | 日(1〜31) | 月の何日か。 |
getHours() | 時(0〜23) | 24時間制。 |
getMinutes() | 分(0〜59) | — |
getSeconds() | 秒(0〜59) | — |
getMilliseconds() | ミリ秒(0〜999) | — |
getTime() | タイムスタンプ(ミリ秒) | 1970年1月1日 UTC からの経過ミリ秒を返します。 |
getDay() | 曜日(0〜6) | 0 が日曜日、1 が月曜日、…6 が土曜日。 |
また、UTC(協定世界時)基準で取得するための getUTCFullYear(), getUTCMonth()… といったメソッドもあります。
set 系メソッド(設定)
同様に、日付や時刻の各要素を後から書き換えることができます:
setFullYear(年)setMonth(月)setDate(日)setHours(時)setMinutes(分)、setSeconds(秒)、setMilliseconds(ミリ秒)setTime(タイムスタンプ)— タイムスタンプを直接設定する
これらを使うと、たとえば「今の日時をベースに月を +1 にする」「時刻を 0 に揃える」などの操作ができます。
注意点として、もし各要素に範囲外の数値を与えると、自動で繰り上がったり繰り下がったりして調整されます。たとえば、月に 12(本来は 0~11)を指定したら翌年の月として扱われる、などです。
文字列への変換(表示形式など)
Date オブジェクトを「見やすい文字列」に変換する方法もいくつかあります。
toString():ローカル時刻を反映した標準的な文字列形式を返します。例:「Tue Aug 19 1975 23:15:30 GMT+0200 (CEST)」など。toDateString():日付部分だけを表す文字列toTimeString():時間部分だけの文字列toISOString():ISO 8601 形式、UTC での日時を返します。例:「2025-10-13T06:30:00.000Z」toLocaleString(),toLocaleDateString(),toLocaleTimeString():実行環境のロケール(言語・地域)に応じて適切な表示を行う形式で文字列化します。
特に toLocaleString() 系は、ユーザーに見せる表示として使いやすい形式を自動で選んでくれるため便利です。
なお、文字列形式に変換するメソッドは、無効な日付の場合には "Invalid Date" という文字列を返すことがあります。
文字列から日付への変換・パース
文字列 ⇒ Date に変換する方法もあり、主に以下があります:
new Date("2025-10-13T15:30:00")のような文字列を渡すDate.parse("2025-10-13T15:30:00"):文字列をパースしてタイムスタンプ(ミリ秒)を返すDate.UTC(...):UTC 基準でのタイムスタンプを得る(その後new Date()に渡して UTC の日時を得るなど)
ただし、文字列のフォーマットによってはパースできないものもあるので注意が必要です。
タイムゾーン・オフセットの扱い
Date オブジェクト自体はタイムゾーン情報を持っておらず、内部では常に UTC 基準のタイムスタンプを保持します。出力や計算をするときに、環境のタイムゾーンが適用されます。
たとえば、toISOString() は常に UTC での時刻を返します。
また、ユーザーのローカルタイムとのずれ(タイムゾーン差)は getTimezoneOffset() メソッドで分単位で取得できます(UTC との差、分単位でのオフセット)。
なぜ「Dateオブジェクトはレガシー(古い方式)」とされるのか
MDN のページにも「Date オブジェクトはレガシーと見なされており、新しい方式を使うことが推奨されるかもしれない」との注意書きがあります。
これは、Date を使った日付/時刻の処理(特にタイムゾーン対応、計算、比較、書式変換など)が複雑でバグを生みやすいこと、また ECMAScript 流派でより強力・正確に日付・時刻を扱えるモジュール(たとえば Temporal API)などが登場しつつあること、などが理由です。
たとえば、日付の加算/減算(1か月後、1年後など)やタイムゾーン変換、曖昧な夏時間の問題などを正しく扱うのは Date だけではミスしやすいという実例もあります。
簡単なコード例:使ってみよう
// 現在日時を取得
const now = new Date();
console.log(now.toString()); // ローカル時刻を文字列で表示
console.log(now.toISOString()); // UTCで ISO 形式で表示
console.log(now.getFullYear()); // 年を取得
console.log(now.getMonth()); // 月を 0〜11 で取得
console.log(now.getDate()); // 日を取得
// 特定の日付を作る(例:2025年12月25日 15:30)
const xmas = new Date(2025, 11, 25, 15, 30, 0); // 月は 11 = 12月
console.log(xmas.toLocaleString()); // ロケールに依存した形式で出力
// 日付の計算:2日後を求める
const twoDaysLater = new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000);
console.log(twoDaysLater.toLocaleString());
// 文字列から日付をパースする
const d = new Date("2025-10-13T08:00:00");
console.log(d.toString());
JavaScript上記のような例で、Date がどのように動くか、手を動かして確認してみるのが理解の近道です。
