質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1269閲覧

Javascript で作成したカレンダー型予定表が 2020年以降 正しい曜日を出力しなくなった。

lemon_2019

総合スコア5

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/12/13 06:22

前提・実現したいこと

15年前に作成したHP用カレンダー型予定表に来年の予定を入力し表示させると曜日が正しく出なくなりました。
(作成から今年2019年12月までは正しく出力されてきた。)
プログラムを調べても原因がつかめず、困っています。

発生している問題・エラーメッセージ

例えば、2020年1月1日は 正しくは金曜日ですが、出力は 月曜日と3日後の曜日が表示されます。 以降、パソコンの日付を変更しても誤った(常に3日後の)曜日が出ます。 ### 該当のソースコード >>> javascript <<< Now=new Date(); //今日の年月日曜日を取得 with(Now) { YY = getFullYear(); MM = getMonth()+1; DD = getDate(); WW = getDay(); } Yoobi=new Array("日","月","火","水","木","金","土"); function Nissu(a, b) { //指定月の日数を取得する関数 if(b==2) { if((a % 4)==0) { if((a % 100==0) && (a % 400!=0)) return 28; else return 29; } else return 28; } else if((b==4) || (b==6) || (b==9) || (b==11)) return 30; else return 31; } //データ文字列の色付け str1=new Array("健康教室","子供クラス","一般クラス","(休み)","休み","有り","呼吸法"); color1=new Array( "blue", "tomato", "darkred", "red", "red", "red", "green"); str2=new Array(); for(i=0; i< str1.length; i++) { str2[i]=str1[i].fontcolor(color1[i]); } str3=new Array(); for(i=0; i< str1.length; i++) { str3[i]=new RegExp(str1[i],"g"); } Txt=""; //ソースの初期化 function Calendar(Tuki,Nen) { //カレンダーを作成する関数 First=0; Txt+="<DIV align=center><TABLE border=0><TR><TD WIDTH=170></TD><TD>"; Txt+="<DIV align=center><TABLE border=1 cellpadding=3 bordercolor=#000099 bgcolor=#eeeeff>"; Txt+="<TR><TD nowrap><FONT size=5 color=#000099><i>"+Nen+"年"+"&nbsp;"+Tuki+"月</i></FONT></TD></TR></TABLE>"; //該当月タイトル Txt+="</TD><TD WIDTH=210 align=right valign=bottom><A HREF='javascript: window.close()'><FONT size=+1 color=#aaccff><b><i>閉じる</i></b></FONT></TD></TR></TABLE>"; Txt+="<BR><TABLE border=1 cellspacing=0 bordercolor=#eeeeff bgcolor=#ffffff>"; Txt+="<TR bgcolor=#ccffff><TD align=center width=30>日</TD>"; Txt+="<TD align=center>曜</TD><TD align=center width=100 nowrap>祝祭日名</TD><TD width=350 align=center nowrap>&nbsp;行&nbsp;事&nbsp;予&nbsp;定&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD></TR>"; Su=Nissu(Nen, Tuki); //指定月の日数 Y=Nen%(Math.floor(Nen/100)); M=Tuki; if(M==1) { M=13; Y-=1; } else if(M==2) { M=14; Y-=1; } A="20"; First=(Math.floor(A/4)-2*A+Y+Math.floor(Y/4)+Math.floor((26*(eval(M)+1)/10)))%7; if(First<0) First+=7; for(i=0; i < Su; i++) { j=(First+i)%7; if(j==0) color="<FONT color='red'>"; else { if(j==6) color="<FONT color='blue'>"; else color="<FONT color='black'>"; } if((i+1==DD) && (Tuki==MM) && (Nen==YY)) today="bgcolor='skyblue'"; else today=""; kyo = Date.parse(Nen+"/"+Tuki+"/"+(i+1)); for(k=0; k < holiday.length; k++) { it=Date.parse(holiday[k]); if(kyo==it) { memo="<FONT color='red'>"+saijitsu[k]+"</FONT>"; color="<FONT color='red'>"; break; } else memo="&nbsp;"; } for(l=0; l < schedule.length; l++) { hd=Date.parse(schedule[l]); if(kyo==hd) { for(m=0; m< str1.length; m++) { yotei[l]=yotei[l].replace(str3[m],str2[m]); } memo2=" "+yotei[l]; break; } else memo2="&nbsp;"; } Txt+="<TR><TD width=30 align='center'"+today+">"+color+(i+1)+"</FONT></TD><TD align='center'"+today+">"+color+Yoobi[j]+"</FONT></TD><TD align='center' width=100>"+memo+"</TD><TD bgcolor=#ddeeff nowrap>"+"&nbsp;"+memo2+"</TD></TR>"; } Txt+="</TABLE></DIV>"; } function newWin(EM,Nen) { //指定月のウィンドウとカレンダーを用意する関数 Txt="<HTML><HEAD><TITLE>"+Nen+"年"+"&nbsp;"+EM+"月</TITLE>"; Txt+="</HEAD><BODY background='../img/back.jpg'>"; Win=window.open("","",'width=600,height=850,menubar=no,directories=no,toolbar=no,location=no,scrollbars=yes,status=no,left:center,top:middle'); //指定月のウィンドウサイズと位置を指定 Calendar(EM,Nen); with(Win.document) { open("text/html"); write(Txt,"</BODY></HTML>"); close(); } } ### 試したこと 上記の //指定月の日数のところに ```Y=Nen%(Math.floor(Nen/100)); //------ 20191202追加 if(Nen>=2020) { Y=Nen.toString().substring(2,4); } //-----

を挿入しますと、2020年3月までは正しい曜日が出力されますが、その後はダメでした。

補足情報(FW/ツールのバージョンなど)

上記ノカレンダー型予定表を表示するファイル一式のzip-fileをここに置いております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/12/13 07:27

とりあえず動くものを提示してください
guest

回答1

0

ベストアンサー

Y の計算にバグがあります。

JavaScript

1Y = Nen % 100;

cf. ツェラーの公式

とはいえ、曜日をごちゃごちゃ計算してバグを埋め込むよりさっさと Date オブジェクトを使ったほうがいいです。

JavaScript

1First = new Date(Nen, Tuki - 1).getDay();

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay

投稿2019/12/13 08:17

編集2019/12/13 08:54
x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lemon_2019

2019/12/14 11:36

回答の方への記入したコメントが(初めての投稿なもので)処理ミスで 消えてしまったようです。改めて記入します。 質問者(lemon_2019) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  早速のご回答ありがとうございました。 早速 これを使って正しく表示されることを確認し、安心して歳を越せる 気分になりました。 JAVA初心者である小生は難しく考えすぎていたようですね。 年末年始は多忙のため、Dateオブジェクトを使う変更は来年 検討してみたいと思っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問