javascriptで営業日を表示
先日人力検索のいわしのjavascriptの質問に回答をした。
Javascriptについて、聞きたい事がありますが、 以下になります… - 人力検索はてな
で、これの仕様を満たせていないとid:susie-tさんに指摘をして貰ったので、ちょっとその対応をしてみた。
<html> <head> <title>営業日計算</title> </head> <body> <div style="background-color:#FFEECC"><b style="color:#555555;">●営業日算出</b></div> <input type="text" id="hoge" maxlength="10">日後の営業日は <input type="button" id="button" value = "表示"><br> <span id="show" style="background:#DDFFFF"></span>です。 </body> </html> <script type="text/javascript"> var $ = function(id) { return document.getElementById(id); } /* * 振り替え休日がある休日(HappyMonday除く)を持ったオブジェクト。 * 春分の日、秋分の日は現状決め打ち。その内対応。 */ var Holidays = function(){} Holidays.prototype = { 101:1, 211:1, 321:1, 429:1, 503:1, 504:1, 505:1, 923:1, 1103:1, 1123:1, 1223:1 }; var Fairing = function(date){ var month = date.getMonth()+1; var date = ((d = date.getDate())<10) ? "0"+d : d; return month.toString() + date.toString(); } function positiveDate(result){ var date = ((d = result.getDate())<10) ? "0"+d : d; var month = ((m = result.getMonth()+1)<10) ? "0"+m : m; return (result.getFullYear() + "/" + month + "/" + date); } var addHappyMonday = function(obj,date) { function F(){}; F.prototype = new obj(); var AddForMonday = { 0:1, 1:0, 2:6, 3:5, 4:4, 5:3, 6:2 } var FIRST_DAY = 1; var addDays; var tmpDate = new Date(date); var param = -1; while(++param<12){ tmpDate.setMonth(param); var tmpMonth = param+1; if ( tmpMonth == 1 || tmpMonth ==10 ) { addDays = 7; } else if ( tmpMonth == 7 || tmpMonth == 9 ) { addDays = 14; } else continue; tmpDate.setDate(FIRST_DAY); tmpDate.setDate(FIRST_DAY + AddForMonday[tmpDate.getDay()] + addDays); F.prototype[Fairing(tmpDate)] = 1; } return new F(); } var calculation = function(counter,date) { if(!(counter = parseInt(counter))) alert('数字をにゅうりょくしてくだしあ><;'); var tmpDate = new Date(date); var i = 0; while(++i<=counter) { tmpDate.setDate(tmpDate.getDate()+1); var day = tmpDate.getDay(); var d = Fairing(tmpDate); //年度が変わればHappyMondayを変更 if (d =="101") { holidays = addHappyMonday(Holidays,tmpDate); } //振替休日対応 if (holidays[d] && day == 0) { counter += 2; //土日祝対応 } else if (day == 0 || day == 6 || holidays[d]) { counter += 1; } } return tmpDate; } $('button').onclick = function() { var date = new Date(); holidays = addHappyMonday(Holidays,date); var tmp = calculation($('hoge').value,date); $('show').innerHTML = positiveDate(tmp); } </script>
根本的なところで間違った認識をしている可能性もあるので、自信がないのだけど多分こんな感じだ。
仕様は、土日祝を飛ばしたX日先の営業日を表示する、という物。
コードの整理が時間がなくて出来てないから、追いにくいだろうと思うのでちょっと解説。
祝日で、固定されていない物はハッピーマンデーには対応した。春分の日と秋分の日はちょっと計算がややこしいので決め打ちしてます。
で、祝日を持ったオブジェクトにハッピーマンデーを追加。ハッピーマンデーは「X日先」の指定が年度をまたがった場合は元旦に変更されます。
振り替え休日に関しては、最近ちょっとルールが変わったみたい。以前は、祝日が日曜日と重なった場合は「次の月曜が休み」だったのが、「次の平日が休み」になったらしい。
参考振替休日 - Wikipedia
このおかげで、ちょっとコーディングが楽になった。以前は「日曜と祝日が重なったら確実に振り替え休日があるわけではない」だったのが、「祝日分は必ずどこかで休み」だ。だから、その分カウンターを1個足してやるだけ。
大体こんな感じで作っては見たけれど、対応は当然日本国内のみで、会社の創立記念日?とか例外的なものは沢山出てきて遠い日付を入れると間違って表示されそう。
さらに、春分の日と秋分の日も決め打ちだし。こちらのサイトでjavascriptで計算をしているから、これを真似ても良かったのだけど、春分の日 - Wikipediaと秋分の日 - Wikipediaを見る限り、いいかな?なんて。
まぁ、言い訳ですよ。はい。