プロが教えるわが家の防犯対策術!

以下のプログラムは土日は無視されますが祝日も平日としてカウントダウンされてしまいます。
土、日、祝日を含まない平日のみをカウントダウンするプログラムを教えていただけますでしょうか?

<html>
<head>
<script language="JavaScript">
<!--

function countdown() {
var kyou = new Date();
var kinen = new Date("Sep 31, 2008 00:00:00");

// 目標日との差のミリ秒(の絶対値)
var tdiff = Math.abs(kinen.getTime() - kyou.getTime());
// 日数
var days = 0;

var mae;
if (kinen.getTime() > kyou.getTime()) {
// 目標日以前なら
mae = true;

// 曜日を取得(日曜が0、月曜が1、...、土曜が6)
var weekday = kyou.getDay();

while (tdiff > 0) {
if (weekday > 0 && weekday < 6) {
++days;
}
weekday = weekday != 6 ? weekday + 1 : 0;
tdiff -= (24 * 60 * 60 * 1000);
}
} else {
// 目標日以降(含む当日)なら
mae = false;

// 曜日を取得(日曜が0、月曜が1、...、土曜が6)
var weekday = kinen.getDay();

// 残りが1日未満になるまで繰り返す
// 元のプログラムがMath.ceilで切り上げを行っているため、
// それにあわせるための処置
while (tdiff > (24 * 60 * 60 * 1000)) {
if (weekday > 0 && weekday < 6) {
++days;
}
weekday = weekday != 6 ? weekday + 1 : 0;
tdiff -= (24 * 60 * 60 * 1000);
}
}

var meate="あ";
with(Math){
var kotoba;
if (mae) {
// 目標日前なら-1日する
--days;
kotoba = meate + "と " + days + "日 です。";
} else {
if (days == 0) {
kotoba = "も" + meate + "です!";
} else {
kotoba = meate + "から" + days + "日が過ぎました。";
}
}
}
document.write(kotoba);
}

//-->
</script>
</head>
<body>
<center><table border=2 bordercolor=00ffff cellpadding=5 cellspacing=0>
<tr bgcolor="#ffffff"><td bgcolor="#ffff80">
<script language="JavaScript">
<!--
countdown();
//-->
</script>
</td></tr>
</table></center>
</body>
</html>

ご教授の方を宜しくお願いします。

A 回答 (3件)

自分にとってこれは難問でした。

はたして正確なのかもわからず、簡単な検証だけしました。(祝日は約10年先まで調べてからカウントしてます)
ミスがなければ好いのですが・・・・。
これ以上は無理です!
<html>
<body>
今年の労働は後<span id="a"></span>日あります。;_;

<script>
window.onload=function(){document.getElementById('a').innerHTML=workdayCount(new Date(2008,12-1,31))};//1月が0なので1つ減る

function workdayCount(e_date){
var c=0;
var s=(new Date()).getTime();
var e=e_date.getTime();
var stp=24*60*60*1000;
var y=(new Date()).getFullYear();
var hdy=[];
for(var m=y+10;y<m;y++){
hdy[y*10000+101]='元旦';
hdy[y*10000+[109,108,114,113,112,111,110][dayCount(y+'/01/01')%7]]='成人の日';
hdy[y*10000+211] = '建国記念の日';
hdy[y*10000+((320.8431+0.242194*(y-1980))|0)-(((y-1980)/4)|0)]='春分の日';
hdy[y*10000+429] = '昭和の日';
hdy[y*10000+503] = '憲法記念日';
hdy[y*10000+504] = 'みどりの日';
hdy[y*10000+505] = '子供の日';
hdy[y*10000+[716,715,721,720,719,718,717][dayCount(y+'/07/01')%7]]='海の日';
hdy[y*10000+[916,915,921,920,919,918,917][dayCount(y+'/09/01')%7]]='敬老の日';
hdy[y*10000+((923.2488+0.242194*(y-1980))|0)-(((y-1980)/4)|0)]='秋分の日';
hdy[y*10000+[1009,1008,1014,1013,1012,1011,1010][dayCount(y+'/10/01')%7]]='体育の日';
hdy[y*10000+1103]='文化の日';
hdy[y*10000+1123]='勤労感謝の日';
hdy[y*10000+1223]='天皇誕生日';
for(var i=101;i<1232;i++){
if(hdy[y*10000+i]){
if(dayCount(y+'/'+((i/100)|0)+'/'+i%100)%7==0 && (hdy[y*10000+i+1])!='') {hdy[y*10000+i+1]='振替休日';i+=2;}
}
}
}

while(s<e){
var ss =new Date(s);
var chkdy=ss.getFullYear()*10000+(ss.getMonth()+1)*100+ss.getDate();
if(0<ss.getDay() && ss.getDay()<6 && hdy[chkdy]==undefined) {c++;}
s+=stp;
}
return c;

}
function serial(date_str){
return (dayCount(date_str)-dayCount('1899/12/31')).toFixed(6);
}
function dayCount(date_str){
var dy=date_str.split(/\/|-| |:/);for(var i=0;i<6;i++) dy[i]=dy[i]?dy[i]-0:0;
var tpy=dy[0]-1;
var d=tpy*365+(tpy/400|0)-(tpy/100|0)+(tpy/4|0)+[0,0,31,59,90,120,151,181,212,243,273,304,334][dy[1]]+dy[2]+(((!(dy[0]%4))^(!(dy[0]%100))^(!(dy[0]%400)))&(dy[1]>2));
var t=dy[3]/24+dy[4]/1440+dy[5]/86400;
return (d+t).toFixed(6);
}

</script>
</body>
</html>
    • good
    • 1
この回答へのお礼

す、すばらしいです!!!
祝日もカウントされていません。
ほんとうに感謝いたします。ありがとうございました。

お礼日時:2008/09/05 00:22

祝日一覧データ


function dayCount(date_str){
var dy=date_str.split(/\/|-| |:/);for(var i=0;i<6;i++) dy[i]=dy[i]?dy[i]-0:0;
var tpy=dy[0]-1;
var d=tpy*365+(tpy/400|0)-(tpy/100|0)+(tpy/4|0)+[0,0,31,59,90,120,151,181,212,243,273,304,334][dy[1]]+dy[2]+(((!(dy[0]%4))^(!(dy[0]%100))^(!(dy[0]%400)))&(dy[1]>2));
var t=dy[3]/24+dy[4]/1440+dy[5]/86400;
return (d+t).toFixed(6);
}
var y=(new Date()).getFullYear();y=2007;
var hdy=[];
hdy[101]='元旦';
hdy[[109,108,114,113,112,111,110][dayCount(y+'/01/01')%7]]='成人の日';
hdy[211] = '建国記念の日';
hdy[((320.8431+0.242194*(y-1980))|0)-(((y-1980)/4)|0)]='春分の日';
hdy[429] = '昭和の日';
hdy[503] = '憲法記念日';
hdy[504] = 'みどりの日';
hdy[505] = '子供の日';
hdy[[716,715,721,720,719,718,717][dayCount(y+'/07/01')%7]]='海の日';
hdy[[916,915,921,920,919,918,917][dayCount(y+'/09/01')%7]]='敬老の日';
hdy[((923.2488+0.242194*(y-1980))|0)-(((y-1980)/4)|0)]='秋分の日';
hdy[[1009,1008,1014,1013,1012,1011,1010][dayCount(y+'/10/01')%7]]='体育の日';
hdy[1103]='文化の日';
hdy[1123]='勤労感謝の日';
hdy[1223]='天皇誕生日';
for(var i=101;i<1232;i++){
if(hdy[i]){
if(dayCount(y+'/'+((i/100)|0)+'/'+i%100)%7==0 && !hdy[i+1]) {hdy[i+1]='振替休日';i+=2;}
}
}
for(i=0,v=y+"\n";i<1232;i++){if(hdy[i]!=undefined) v+=i+'='+hdy[i]+'\n';}
alert(v);
    • good
    • 0

Javascriptは祝日に対応していません。


ですから、「祝日一覧リスト」のようなものを作成し、

「現在の日付が祝日一覧リストに存在したら、その日はカウントしない」

という処理を土日判定付近に加えてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!