• ベストアンサー

selectタグで日付を生成

プルダウンメニューで、指定の日付をYYYY/MM/DDの形式で生成して表示されたいと思っています。 具体的な方法は、先日別の質問にて御教授いただきました。 しかし途中で仕様が変更になってしまって、今回新たにご質問させて頂いております。 希望としては、本日から4営業日(土日祝日休み)から30日先までの日付をYYYY/MM/DDの形式で生成して表示されたいと思っています。 そして、初期表示として <option value="default" selected>-------</option> が先頭にくるようにして、 2行目からスクリプトでの書き換えを行なうようにしたいと思っています。 日付指定の補足ですが、 本日から4営業日後の日付は、土日祝を含めての日数で表示させたいと思います。 例) 2009/7/16 だった場合 (プルダウンメニューで) 2009/7/23 2009/7/24 2009/7/25 2009/7/26 2009/7/27 … 2009/8/15 ちょっと心配ですが、祝日もスクリプトでカウントされるのでしょうか。。 質問内容が分かりづらいかと存じますが、 何卒よろしくお願いいたします。 以前の質問URLはこちらです。 http://oshiete1.goo.ne.jp/qa5108724.html <html> <head> <script type="text/javascript"> window.onload = function() { var d, str, elm = document.getElementById('delidate'); var day = new Date(); day.setMilliseconds(4*24*60*60*1000); for (d=0; d<26; d++) { str = day.getFullYear() + '/' + (day.getMonth() + 1) + '/' + day.getDate(); elm.options[d] = new Option(str, str); day.setMilliseconds(24*60*60*1000); } } </script> </head> <body> <select name="delidate" id="delidate"> <option value="default" selected>-------</option> <option value="4日後">4日後</option> <option value="5日後">5日後</option> <option value="6日後">6日後</option> <option value="7日後">7日後</option> <option value="8日後">8日後</option> <option value="9日後">9日後</option> <option value="10日後">10日後</option> <option value="10日後">11日後</option> <option value="10日後">12日後</option> <option value="10日後">13日後</option> <option value="10日後">14日後</option> <option value="10日後">15日後</option> <option value="10日後">16日後</option> <option value="10日後">17日後</option> <option value="10日後">18日後</option> <option value="10日後">19日後</option> <option value="10日後">20日後</option> <option value="10日後">21日後</option> <option value="10日後">22日後</option> <option value="10日後">23日後</option> <option value="10日後">24日後</option> <option value="10日後">25日後</option> <option value="10日後">26日後</option> <option value="10日後">27日後</option> <option value="10日後">28日後</option> <option value="10日後">29日後</option> <option value="30日後">30日後</option> </select> </body> </html>

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

ぐだぐだだけど、よくかんがえたら、そこからはかんたん? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>ひづけ</title> <select name="delidate" id="delidate"> <option value="" selected>-------</option> <option value="4">4日後</option> <option value="5">5日後</option> <option value="6">6日後</option> <option value="7">7日後</option> <option value="8">8日後</option> <option value="9">9日後</option> <option value="10">10日後</option> <option value="11">11日後</option> <option value="12">12日後</option> <option value="13">13日後</option> <option value="14">14日後</option> <option value="15">15日後</option> <option value="16">16日後</option> <option value="17">17日後</option> <option value="18">18日後</option> <option value="19">19日後</option> <option value="20">20日後</option> <option value="21">21日後</option> <option value="22">22日後</option> <option value="23">23日後</option> <option value="24">24日後</option> <option value="25">25日後</option> <option value="26">26日後</option> <option value="27">27日後</option> <option value="28">28日後</option> <option value="29">29日後</option> <option value="30">30日後</option> </select> <script type="text/javascript"> //@cc_on Number.prototype.zero = function(n){ return ('0000000000'+ this).slice(-n); } Date.prototype.hizuke_JP = function(){  return this.getFullYear().zero(4)+'年'+(this.getMonth()+1).zero(2)+'月'+this.getDate().zero(2)+'日 ('+['日','月','火','水','木','金','土'][this.getDay()]+')'; } function dayCount (y, m, d){  return (y-=(m<3)*1,m+=(m<3)*12,y*365+(y/4|0)-(y/100|0)+(y/400|0)+(306*(m+1)/10|0)-428+d); } var Holiday = function (y0, y1) {  var i, y, day;  this.List = { };  if (undefined === y1) y1 = y0;  for (i = y0; i <= y1; i++) {   y = i * 10000;   this.List[y + 101] = '元旦';   this.List[y + [109,108,114,113,112,111,110][dayCount(i,1,1)%7]] = '成人の日';   this.List[y + 211] = '建国記念の日';   this.List[y + ((320.8431+0.242194*(i-1980))|0)-(((i-1980)/4)|0)] = '春分の日';   this.List[y + 429] = '昭和の日';   this.List[y + 503] = '憲法記念日';   this.List[y + 504] = 'みどりの日';   this.List[y + 505] = '子供の日';   this.List[y + [716,715,721,720,719,718,717][dayCount(i,7,1)%7]] = '海の日';   this.List[y + [916,915,921,920,919,918,917][dayCount(i,9,1)%7]] = '敬老の日';   this.List[y + ((923.2488+0.242194*(i-1980))|0)-(((i-1980)/4)|0)] = '秋分の日';   this.List[y + [1009,1008,1014,1013,1012,1011,1010][dayCount(i,10,1)%7]] = '体育の日';   this.List[y + 1103] = '文化の日';   this.List[y + 1123] = '勤労感謝の日';   this.List[y + 1223] = '天皇誕生日';  }  for (day in this.List){   if (this.List[day]) {    i = parseInt(day);    if (this.List[day] && (dayCount(i/10000|0,((i%10000)/100|0),i%100) %7) == 0) {    this.List[i+1] = '振替休日';    }   }  } } Holiday.prototype.get = function (y,m,d) {  return this.List[y * 10000 + m * 100 + d] || null; }; var s = document.getElementById('delidate'), o, i, y, m, d, b, t; while(o = s.firstChild) s.removeChild(o); s.add(new Option('----/--/--','') /*@if(!@_jscript) */, null /*@end@*/); var now = new Date; var a = new Holiday(now.getFullYear(),now.getFullYear()+1); var eigyo = 0; for (i = 1; i < 31; i++) {  now = new Date;  now.setHours((i)*24);  y = now.getFullYear();  m = now.getMonth()+1;  d = now.getDate();  b = now.getDay();  h = a.get(y, m, d);  if (!h && (b!=0 && b!=6) && eigyo<4) eigyo++;  if (eigyo>3) {   t = now.hizuke_JP();   s.add(new Option(t,i) /*@if(!@_jscript) */, null /*@end@*/);   eigyo++;  } } </script>

kazuya88
質問者

お礼

このスクリプトは1年後、2年後でも対応しているものでしょうか? また4営業日を起点にして30日ということでしたが、間違えておりました。 本日を起点に30日後でございました。。申し訳ないです。 また会社の創業記念日など突発的な休日の登録については、 this.List[y + 909] = '会社創設日'; などと追加すればよろしいでしょうか。

すると、全ての回答が全文表示されます。

その他の回答 (12)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

どの日が営業日なのか 計算上出るのかしら? もし出るのなら for文で、作成された日が営業日かどうかを判定して 営業日でないならcontinueを実行すればいいわ。 営業日ならelm.options[d]~以降を実行ね。 計算でできないのなら 営業日配列もしくは営業日外配列を別途用意して その配列と一致するものがないかを判定してあげるロジックにする必要があるわね。 参考  曜日の取得:http://javascriptist.net/ref/date.getday.html  祝日判定例:http://www.geocities.co.jp/Hollywood-Theater/2500/bekkan/holiday.html  ※古いので注意

kazuya88
質問者

お礼

ご回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

ちなみにjavascriptで var dd = new Date(2009,7,15); alert(dd.getDay()); とすると、3になります日曜(0)~土曜(6)ですね。 ハンドリングは面倒そうですね。 祝日(秋分の日、春分の日、振り替え代休..)は毎年変わりますよね、 javascriptの関数はありません。(他の言語でもないです) 祝日判定は自分で作るしかないですね。VBAのソースならもってますが、 そこまでやりますか?

kazuya88
質問者

お礼

ご回答ありがとうございます。 確かに毎年祝日の曜日は変わりますし、会社の突発的な休みなんかも想定するとスクリプトで実現するにはかなり大変な事と認識しました。 上に記載頂いている方達のを参考にできる所までやってみたいと思います。 前回も今回もお世話になりました。 ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A