指定した2つの日付の間に営業日が何日あるかを取得するコードの例です
それを実現するために以下を取得しています
- 範囲内の日曜日
- 範囲内の土曜日
- 範囲内の祝日
- それ以外は平日=営業日
日曜日と土曜日はnew Date("日付").getDay() で得られる曜日番号で取得しています
祝日はGoogleカレンダーの日本の祝日から取得して public_holidays_obj でオブジェクトにしています
コード.gs
function get_days(){
var start = "2018/01/01";
var end = "2018/02/01";
var start_date = new Date(start);
var end_date = new Date(end);
var diff = (end_date - start_date) / 1000 / 60 / 60 / 24;
var weeks = Math.floor(diff / 7);
var rest_days = (diff % 7);
var days_obj = get_each_days(start_date, diff);
Logger.log([days_obj, days_obj["weekdays"].length])
}
function get_each_days(start_date, diff) {
var obj = {}
var sundays = obj["sundays"] = [];
var saturdays = obj["saturdays"] = [];
var public_holidays = obj["public_holidays"] = [];
var weekdays = obj["weekdays"] = [];
for(var i = 0; i < diff; i++){
var year_now = start_date.getFullYear();
var month_now = start_date.getMonth();
var date_now = start_date.getDate();
var new_date = new Date(year_now, month_now, date_now + i);
var day = new_date.getDay();
var date = Utilities.formatDate(new_date, 'Asia/Tokyo', 'yyyy/MM/dd');
if(day == 0){
sundays.push(date);
}else if(day == 6){
saturdays.push(date);
}else if(public_holidays_obj[date]){
public_holidays.push(date);
}else{
weekdays.push(date);
}
}
return obj;
}
var public_holidays_obj =
{
"2018/01/01": "元日",
"2018/01/08": "成人の日",
"2018/02/11": "建国記念の日",
"2018/02/12": "建国記念の日 振替休日",
"2018/03/21": "春分の日",
"2018/04/29": "昭和の日",
"2018/04/30": "昭和の日 振替休日",
"2018/05/03": "憲法記念日",
"2018/05/04": "みどりの日",
"2018/05/05": "こどもの日",
"2018/07/16": "海の日",
"2018/08/11": "山の日",
"2018/09/17": "敬老の日",
"2018/09/23": "秋分の日",
"2018/09/24": "秋分の日 振替休日",
"2018/10/08": "体育の日",
"2018/11/03": "文化の日",
"2018/11/23": "勤労感謝の日",
"2018/12/23": "天皇誕生日",
"2018/12/24": "天皇誕生日 振替休日"
}
|
意訳この機能がやること
startの日付を決める
endの日付を決める(この日付になるまで)
new Dateにstartを渡して
new Dateにendを渡して
その日数を計算して(ミリ秒で出るので÷1000で秒に、÷60で分に、÷60で時間に、÷24で日数になる)
その日数を7で割って何週間か計算して
あまった日数を計算して
get_each_daysにstart_date, diffを渡して
返ってきたオブジェクトとweekdaysの数をログに出す
この機能がやること
以下のオブジェクトを用意する
obj = { sundays: [],
saturdays: [],
public_holidays: [],
weekdays: [] }
渡されたdiff(日数)の数だけ以下を繰り返す
渡されたstart_dateの西暦を取得して
月を取得して
日付を取得して
日付に1ずつ日数を足して
曜日の番号を取得→ 0 は日曜日で 1は月曜日~ 6 は土曜日
yyyy/MM/ddの形にフォーマットして
もし0なら(日曜日なら)
sundaysの配列に追加して
もし6なら(土曜日なら)
saturdaysの配列に追加して
もしpublic_holidays_objにあれば
public_holidays配列に追加して
それ以外なら
weekdays配列に追加する
出来上がったobjを返す
public_holidays_objのオブジェクトを用意する
|
実行結果
weekdaysのlengthで取得した日数がログに出ます
関連記事
Googleカレンダーで日本の祝日を取得してJSONで保存する
Utilities.formatDate()で日付をフォーマットする
参考
Date.prototype.getDay()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay
