2つの日付の間が何ヶ月あるか求めたい

決められた過去の日付から現在の日付までの月の差分を計算して年月でリストをJavaScriptで動的に作成したかったので実装したときのメモ。

月の差分を計算する関数を作りました。

/**
 * Calculate the month difference of a period.
 * @param {Date} d1 - Difference start date.
 * @param {Date} d2 - Difference end date.
 * @return {number} diff - diff month.
 */
const diffMonth = (d1, d2) => {
  let d1Month, d2Month;

  d1Month = d1.getFullYear() * 12 + d1.getMonth();
  d2Month = d2.getFullYear() * 12 + d2.getMonth();

  return d2Month - d1Month;
}

引数d1に計算する期間の開始年月日、d2に終了年月日を渡します。例えば、「2019年11月1日」から「2020年5月1日」までの月を差分を計算すると…

  • d1Month = 2019 * 12ヵ月 + 10(getMonthは0から11を取得する)
  • d2Month = 2020 * 12ヵ月 + 4(getMonthは0から11を取得する)

それぞれ計算結果が「24,238」「24,244」になるので、この差分を計算して「24,244 – 24,238 = 6」となります。これをもとにプルダウンリストを作りたい。

試しに作ってみた。

ソースコードは以下の通り。コピペで動くと思います。

$(function() {
  /**
   * Calculate the month difference of a period.
   * @param {Date} d1 - Difference start date.
   * @param {Date} d2 - Difference end date.
   * @return {number} diff - diff month.
   */
  const diffMonth = (d1, d2) => {
    let d1Month, d2Month, diff;

    d1Month = d1.getFullYear() * 12 + d1.getMonth();
    d2Month = d2.getFullYear() * 12 + d2.getMonth();

    diff = d2Month - d1Month;

    return diff;
  }

  /**
   * Create data for the now months from 2020/07/01.
   */
  const createYearMonth = () => {
    let
      date = new Date(2019, 10, 1),
      now = new Date(),
      diff,
      select = $("#ym");

    diff = diffMonth(date, now);

    for (let i = diff; i >= 0; i--) {
      let ymd = new Date(now.getFullYear(), now.getMonth() + 1, 0);

      select.append(
        $("

できた!\(^o^)/
これを作っていて改めてIEはだめだこりゃ感があるな。上のソースコードはIEでは動かないです。アロー演算子が使えないのとpadStart()関数が使えないので、その部分を書き直す必要があります。ブラウザ上で動くBabelのサービスがあったので、そちらで変換をかけるという手もアリ。