JavaScirptで土日、祝日を除いた最終日を取得する方法

2023年6月2日金曜日

javascript

t f B! P L

土日、祝日を除いた最終日に何かの締め処理をするシステムって結構多いですよね。(そうでもない?)
単純に月末日を求める方法であれば、プログラム言語の標準APIに用意されていることもありますが、土日、祝日を除いた最終日となると、さすがに自前で祝日のリスト管理を行ったロジックにする必要があります。

この記事では、JavaScirptで土日、祝日を除いた最終日を取得するサンプルコードを紹介します。

そもそも祝日の管理どうする?

日本の祝日は「成人の日」や「海の日」に代表するように、その年のカレンダーによって変動する祝日があります。また、天皇誕生日のような祝日や、東京オリンピックの時のように政治的な都合で祝日が移動することもあるため、数年先の祝日を正確に知ることはできません。

とりあえず今回は、次のような形で祝日をリストで持つような形とします。

const holiday_list = [
  "2023/01/01",
  "2023/01/02",
  //・・・
];

土日、祝日を除いた最終日を求めるコード

前置きが長くなりましたが、土日、祝日を除いた月の最終日を求めるJavaScriptのサンプルコードを紹介します。

まず、祝日かどうかを判定する関数を作ります。前述のとおり、今回は祝日となる日を2030年まで配列で持たせておきます。

// 与えられた祝日リスト
const holiday_list = [
  "2023/01/01",
  "2023/01/02",
  // 残りの日付を追加します...
];

// 引数の日付が祝日であるかどうかをチェックする関数
function isHoliday(date) {
  const dateString = date.toISOString().slice(0, 10).replace(/-/g, '/');
  return holiday_list.includes(dateString);
}

次に土日かどうかを判定する関数を作ります。これも単純で、日付から曜日を取得して土日かどうか判定しています。

// 引数の日付が週末であるかどうかをチェックする関数
function isWeekend(date) {
  const dayOfWeek = date.getDay();
  return dayOfWeek === 0 || dayOfWeek === 6;  // 0: Sunday, 6: Saturday
}

最後に、引数で与えられた月の土日、祝日を除いた最終日を求める関数を作ります。

// 引数の月の最終営業日を返す関数
function getLastBusinessDay(year, month) {
  // 月の最終日(次の月の1日前)を取得
  let date = new Date(year, month, 0);

  // その日が営業日でなければ、前の日に移動
  while (isHoliday(date) || isWeekend(date)) {
    date.setDate(date.getDate() - 1);
  }

  return date;
}

使ってみる

上で作成した getLastBusinessDay 関数を使ってみる。2023/12の最後の平日は「29日」なので合っている感じです。

const lastDay = getLastBusinessDay(2023,12)
console.log(lastDay)  // Fri Dec 29 2023 00:00:00 GMT+0900 (日本標準時)

まとめ

JavaScirptで土日、祝日を除いた最終日を取得する方法を紹介しました。特定の人にしか使い道がない処理かもしれませんが、役に立ったなら幸いです。

最後に今回使った 2030年までの祝日の配列を作成するコードも掲載しておきます。

const holiday_list = [
  "2023/01/01",
  "2023/01/02",
  "2023/01/09",
  "2023/02/11",
  "2023/02/23",
  "2023/03/21",
  "2023/04/29",
  "2023/05/03",
  "2023/05/04",
  "2023/05/05",
  "2023/07/17",
  "2023/08/11",
  "2023/09/18",
  "2023/09/23",
  "2023/10/09",
  "2023/11/03",
  "2023/11/23",
  "2024/01/01",
  "2024/01/08",
  "2024/02/11",
  "2024/02/12",
  "2024/02/23",
  "2024/03/20",
  "2024/04/29",
  "2024/05/03",
  "2024/05/04",
  "2024/05/05",
  "2024/05/06",
  "2024/07/15",
  "2024/08/11",
  "2024/08/12",
  "2024/09/16",
  "2024/09/22",
  "2024/09/23",
  "2024/10/14",
  "2024/11/03",
  "2024/11/04",
  "2024/11/23",
  "2025/01/01",
  "2025/01/13",
  "2025/02/11",
  "2025/02/23",
  "2025/02/24",
  "2025/03/20",
  "2025/04/29",
  "2025/05/03",
  "2025/05/04",
  "2025/05/05",
  "2025/05/06",
  "2025/07/21",
  "2025/08/11",
  "2025/09/15",
  "2025/09/23",
  "2025/10/13",
  "2025/11/03",
  "2025/11/23",
  "2025/11/24",
  "2026/01/01",
  "2026/01/12",
  "2026/02/11",
  "2026/02/23",
  "2026/03/20",
  "2026/04/29",
  "2026/05/03",
  "2026/05/04",
  "2026/05/05",
  "2026/05/06",
  "2026/07/20",
  "2026/08/11",
  "2026/09/21",
  "2026/09/22",
  "2026/09/23",
  "2026/10/12",
  "2026/11/03",
  "2026/11/23",
  "2027/01/01",
  "2027/01/11",
  "2027/02/11",
  "2027/02/23",
  "2027/03/21",
  "2027/03/22",
  "2027/04/29",
  "2027/05/03",
  "2027/05/04",
  "2027/05/05",
  "2027/07/19",
  "2027/08/11",
  "2027/09/20",
  "2027/09/23",
  "2027/10/11",
  "2027/11/03",
  "2027/11/23",
  "2028/01/01",
  "2028/01/08",
  "2028/02/11",
  "2028/02/12",
  "2028/02/23",
  "2028/03/20",
  "2028/04/29",
  "2028/05/03",
  "2028/05/04",
  "2028/05/05",
  "2028/07/17",
  "2028/08/11",
  "2028/09/18",
  "2028/09/22",
  "2028/10/09",
  "2028/11/03",
  "2028/11/23",
  "2029/01/01",
  "2029/01/08",
  "2029/02/11",
  "2029/02/12",
  "2029/02/23",
  "2029/03/20",
  "2029/04/29",
  "2029/04/30",
  "2029/05/03",
  "2029/05/04",
  "2029/05/05",
  "2029/07/16",
  "2029/08/11",
  "2029/09/17",
  "2029/09/23",
  "2029/09/24",
  "2029/10/08",
  "2029/11/03",
  "2029/11/23",
  "2030/02/23",
  "2030/03/20",
  "2030/04/29",
  "2030/05/03",
  "2030/05/04",
  "2030/05/05",
  "2030/05/06",
  "2030/07/15",
  "2030/08/11",
  "2030/08/12",
  "2030/09/16",
  "2030/09/23",
  "2030/10/14",
  "2030/11/03",
  "2030/11/04"
];
スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ