In JavaScript, the getMonth() method retrieves the current month from a Date object as a value between 0 (January) and 11 (December).
Dateオブジェクトが持つメソッドのひとつに、getMonth()というものがあります。これは、その Dateオブジェクトが示す日時の「月」を取得するためのメソッドです。しかし、取得される値や挙動にはいくつか特徴があるため、誤解やバグを招かないようにしっかり理解しておく必要があります。
JavaScript
const date = new Date();
const month = date.getMonth();
console.log(month);
JavaScript
const date = new Date("2024-12-15");
console.log(date.getMonth()); // 11 (12月)
console.log(date.getMonth() + 1); // 12 (12月を人間向けに表す)
getMonth() はローカルタイムベース
getMonth() はローカルタイム(ブラウザや実行環境が設定しているタイムゾーン)に基づいて月を取得します。
例えば、ユーザが日本時間のPCで実行している場合、オブジェクトが示す日時がどこのタイムゾーンかによって、Dateオブジェクトの内部的な時刻が変化していることがあります。
getUTCMonth() との違い
Dateオブジェクトには、同様のメソッドとして getUTCMonth() があります。これは**UTC(協定世界時)**に基づいた月を取得します。
タイムゾーンの差によって、getMonth() と getUTCMonth() の値が異なることがあり、海外のユーザ向けの時刻表示などでは注意が必要です。
JavaScript
const date = new Date("2024-12-31T23:00:00Z"); // UTCで12月31日23時
console.log(date.getMonth()); // 実行環境のタイムゾーン次第で値が変わる
console.log(date.getUTCMonth()); // 常に 11 (UTCで12月のため)
フォーマットとして使う場合
よくあるユースケースとして、年月日の文字列を作りたいときに getMonth() を使うケースがあります。しかし、先述のとおり 0〜11 が返ってくるので、そのまま文字列にすると「2024-11-15」のように、人間が月を読み違える可能性があります。よって、以下のように+1することが基本です。
JavaScript
function formatDate(date) {
const year = date.getFullYear();
const month = date.getMonth() + 1; // +1しないと月がズレる
const day = date.getDate();
// ゼロ埋めは好みに応じて実装
return `${year}/${String(month).padStart(2, '0')}/${String(day).padStart(2, '0')}`;
}
const myDate = new Date("2024-12-15");
console.log(formatDate(myDate)); // 2024/12/15
日付操作時の月のオーバーフロー
Dateオブジェクトは月の値が 0 〜 11 の範囲を超えると、内部的に自動調整されます。そのため、setMonth() と合わせて扱う時に注意が必要です。
JavaScript
const date = new Date("2024-12-15");
// 月の値が 12 を超えると自動的に翌年になる
date.setMonth(date.getMonth() + 1);
console.log(date.toString());
// => 2025年1月15日に相当する日時として処理される(タイムゾーン次第)
getMonth() は値を参照するだけですが、ゼロベースであることを忘れて setMonth() の計算を行うと、目的の月からずれる結果を引き起こすことがあるため気をつけましょう。