JavaScriptだけでなく、どのプログラミング言語にも日本の祝日という概念はありません。
ですので、いつもプログラムでも営業日を特定する際にとても苦労しています。
そこで今回は、JavaScriptで指定した日が営業日かどうか調べる方法をご紹介します!
【目的】JavaScriptで営業日を調べたい!
営業日という考え方は企業によって様々です。
特に土曜日を休日としていない企業もあるので、営業日にするかどうかは分かれることが多いと思います。
著者の会社では土曜日は休日ですが、お客様は土曜日を営業日としています。
働き過ぎ!w
JavaScriptで営業日を判定する上でのポイントは以下の2つです。
- 曜日を調べる関数は存在する!
- 祝日は愚直に書くしかない!
JavaScriptで曜日を判定する
JavaScriptには日付から曜日を調べる関数が存在するので、こちらを利用します。
Date.prototype.getDay()
日付(Date)オブジェクトに使うと、以下のように0~6の数値が帰ってきます。
整数値で、 0 から 6 までの値を取り、地方時に基づいて指定された日付の曜日に対応し、 0 は日曜日、 1 は月曜日、 2 は火曜日のようになります。
引用:Date.prototype.getDay() – JavaScript | MDN
以下に簡単なサンプルと記載しておきます。
var today = new Date (); var dayOfWeek = ['日','月','火','水','木','金','土'][today.getDay()]; console.log(dayOfWeek + '曜日');
JavaScriptの日付関数は他にも使用するので、Mozillaの公式サイトで事前に確認しておいてください。
祝日データについて
冒頭にも記述しましたが、祝日データはないので全て手入力します。
内閣府が正式に用意している祝日データのCSVファイルもありますので、ぜひ活用してみてください!
しかし、今回の記事の内容を応用すれば、振替休日を調べることも簡単にできますよ!
JavaScriptで営業日を判定する
今日が営業日であることを調べるには、休日以外であることを確認します。
つまり、以下の2点に当てはまらなければ営業日だという考え方です。
- 日曜日でないこと
- 祝日でないこと
祝日(休業日)を配列に格納する
まずは前述の通り、JavaScriptにも祝日を判定する関数は無いので、祝日を配列に格納してあげます。
後ほど記述しますが、日付はYYYYMMDD形式にフォーマットして比較しますので、以下のように書きます。
const holiday = [ '20220101', '20220110', '20220211', ・・・<省略>・・・ '20221010', '20221103', '20221123', ];
ここでのポイントは、国が定めた祝日だけではなく、振替休日や会社の休業日も記載しておきましょう。
例えば、年末年始の祝日は元旦(1月1日)だけだが、29日から翌年の3日までは会社がお休み。
それから、お盆や会社の創立記念日などもあるかもしれません。
JavaScriptで日付をフォーマット
JavaScriptで日付オブジェクトをそのまま出力すると、以下のように日付以外にも判定する際に不要な曜日や時間、タイムゾーンなどの情報も含まれてしまします。
var objDate = new Date(); console.log(objDate); // 出力結果:2022-11-16T13:16:31.682Z // または、:Wed Nov 16 2022 13:16:32 GMT+0900 (JST)
これでは比較をするのが難しいので、このように日付をYYYYMMDD形式にフォーマットしてあげます。
// 今日の日付を取得 var objDate = new Date(); // 今日の日付をYYYYMMDD形式に変換 var objYMD = objDate.getFullYear() + ('0' + (objDate.getMonth() + 1)).slice(-2) + ('0' + objDate.getDate()).slice(-2); // 出力結果:20221116
日付オブジェクトから年月日をそれぞれ抽出して連結し、YYYYMMDDの文字列に変換しています。
ここでのポイントは2つ。
getMonth()
メソッドは1月を0、2月を1・・・12月を11と返すので+1する。
月と日については、先頭に0を付けてslice()
メソッドで2桁の文字列にしている。
JavaScriptで曜日と日付を比較する
以上で準備が整いました!
それでは、JavaScriptでgetDay()
メソッドで取得した曜日と、配列に記載した日付を比較して、営業日かどうかを判定しましょう。
こちらが完成形です!
// 祝日を配列で記載(サンプル) const holiday = [ '20221010', '20221103', '20221123', ]; // 今日の日付を取得 var objDate = new Date(); // 今日の日付をYYYYMMDD形式に変換 var objYMD = objDate.getFullYear() + ('0' + (objDate.getMonth() + 1)).slice(-2) + ('0' + objDate.getDate()).slice(-2); // 営業日判定(土日祝除く) if (objDate.getDay() != 0 && holiday.indexOf(objYMD) == -1) { console.log("今日は営業日です"); } else { console.log("今日は休業日です"); } // 出力結果:今日は営業日です
まずは、getDay()
メソッドで帰ってきた値が0、つまり日曜日でないこと、かつ、indexOf()
メソッドでholiday
配列の中に今日の日付が含まれていないことを判定しています。indexOf()
メソッドは、配列の中に指定した文字列が入っていれば、そのインデックス番号(要素数)を返します。
ですので、存在しなければ-1、存在すれば0以上を返します。
また、配列に特定の文字列が含むか判定するには、indexOf()
メソッド以外にもincludes()
メソッド等、他のメソッドでも判定できますが、その話は別の機会で。
【おまけ】JavaScriptで昨日以前の営業日を調べる
最後に、上記を応用してJavaScriptで昨日以前の営業日を調べる方法をご紹介します!
例として、今日が2022年10月11日だったとします。
すると、10日が祝日(月)、9日(日)なので、以下の営業日は8日(土)になります。
// 祝日を配列で記載 const holiday = [ '20221010', '20221123', '20221223' ]; // 今日の日付を取得 var objDate = new Date(); // 今日の日付をYYYYMMDD形式に変換 var objYMD = objDate.getFullYear() + ('0' + (objDate.getMonth() + 1)).slice(-2) + ('0' + objDate.getDate()).slice(-2); // 前回の営業日まで遡る for (i = 1; i < -1; i++) { // 1日前の日付を取得 objDate.setDate(objDate.getDate() - 1); objYMD = objDate.getFullYear() + ('0' + (objDate.getMonth() + 1)).slice(-2) + ('0' + objDate.getDate()).slice(-2); // 営業日判定(土日祝除く) if (objDate.getDay() != 0 && holiday.indexOf(objYMD) == -1) { break; } } // 前回の営業日 console.log(objYMD); // 出力結果:20221008
for
文のループ内で日付を1日ずつ遡って判定し、営業日にだったらループを抜ける仕組みです。
ループの10回という数字は、10日以上休業日が続くはずがないと思って安易に設定していますので、気になる方はwhile
文で無限ループしても良いかもしれませんね。
上記のコードを関数化してしまえば、今日の日付でなくても任意の日付から遡って確認できます。
また使い方を工夫すれば、タイムスタンプ等からも判定することもできますよ!
- Original:https://minory.org/javascript-working-day.html
- Source:Minory
- Author:管理者