🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

3回答

1473閲覧

カレンダー作成で質問です。祝日に挟まれた日を自動的に国民の祝日にしたいです。

maiko0318

総合スコア876

JavaScript

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

0グッド

0クリップ

投稿2019/12/02 22:19

要望いただいたので再質問します。
ここに機能追加をします。
・祝日が前後にあると真ん中を国民の休日にする。
(4/29と5/1と5/3が祝日なら4/30と5/2を国民の休日にする)
4月のカレンダーを書くのに5月1日をみて祝日だったら4/30を国民の休日に、
5月のカレンダーを書くのに4/30が祝日か見に行かなければならなくなる。
天皇誕生日、山の日、海の日、体育の日、スポーツの日の改定は今回は求めません。

Javascript

1<html> 2 3<head> 4 5<title></title> 6 7<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 8<META http-equiv="Content-Style-Type" content="text/css"> 9 10<script language="JavaScript"> 11<!--- 12 13function cal(YYYY, MM){ 14 monthDay = new Array(31,28,31,30,31,30,31,31,30,31,30,31); 15// monthName = new Array("January","February","March","April","May","June","July","August","September","October","November","December"); 16 monthName = new Array("1-睦月","2-如月","3-弥生","4-卯月","5-皐月","6-水無月","7-文月","8-葉月","9-長月","10-神無月","11-霜月","12-師走"); 17 saijituNM = new Array("元日","成人の日:第2月曜日","建国記念の日","春分の日","昭和の日","憲法記念日","みどりの日","こどもの日","海の日:第3月曜日","敬老の日:第3月曜日","秋分の日","体育の日:第2月曜日","文化の日","勤労感謝の日","天皇誕生日","国民の休日","山の日","即位の礼","即位正殿の儀"); 18 syunbun = new Array(20,20,21,21,20,20,21,21,20,20,21,21,20,20,21,21,20,20,21,21,20,20,21,21,20,20,20,21,20,20,20); 19 syuubun = new Array(23,23,23,23,23,23,23,23,23,23,23,23,22,23,23,23,22,23,23,23,22,23,23,23,22,23,23,23,22,23,23); 20 21 sf = 0; snext = 0; 22 23 now = new Date(); 24 yyyy = now.getYear() + 1900; 25 mm = now.getMonth()+1; 26 dd = now.getDate(); 27 28 YYYY1 = Math.floor(YYYY / 4); 29 YYYY2 = Math.floor(YYYY / 100); 30 YYYY3 = Math.floor(YYYY / 400); 31 32 if (YYYY != YYYY1 * 4) monthDay[1] = 28; 33 else 34 if (YYYY != YYYY2 * 100) monthDay[1] = 29; 35 else 36 if (YYYY != YYYY3 * 400) monthDay[1] = 28; 37 else monthDay[1] = 29; 38 39 leftUP = - YYYY - YYYY1 + YYYY2 - YYYY3; 40 if (monthDay[1] == 29) leftUP = leftUP + 1; 41 42 for (i = 0; i < MM - 1; i++){ 43 leftUP = leftUP - monthDay[i]; 44 } 45 46 leftUP1 = Math.ceil(leftUP / 7); 47 leftUP = leftUP - leftUP1 * 7; 48 49 document.write('<table border=1 cellspacing=0 bordercolor=white>'); 50 51// document.write('<tr align=center><td colspan=7>' + YYYY + '年' + MM + '月' + '</td></tr>'); 52 53 document.write('<tr><td colspan=2 align=center>' + YYYY + '</td>'); 54 document.write('<td colspan=5 align=right>' + monthName[MM - 1] + '</td></tr>'); 55 56 document.write('<tr align=center><td><font color=red>日</font></td><td>月</td><td>火</td>'); 57 document.write('<td>水</td><td>木</td><td>金</td><td><font color=blue>土</font></td></tr>'); 58 59 for (y = 0; y < 6; y++){ 60 document.write('<tr align=center>'); 61 62 for (x = 0; x < 7; x++){ 63 DD = leftUP + y * 7 + x + 1; 64 sf = 0; 65 if (MM == 1 && DD == 1) sf = 1; 66 else if (MM == 1 && x == 1 && DD >= 8 && DD <= 14) sf = 2; 67 else if (MM == 2 && DD == 11) sf = 3; 68 else if (MM == 2 && DD == 23 && YYYY > 2019) sf = 15; 69 else if (MM == 3 && YYYY >= 2000 && YYYY <= 2030 70 && DD == syunbun[YYYY - 2000]) sf = 4; 71 else if (MM == 4 && DD == 29) sf = 5; 72 else if (MM == 4 && DD == 30 && YYYY == 2019) sf = 16; 73 else if (MM == 5 && DD == 1 && YYYY == 2019) sf = 18; 74 else if (MM == 5 && DD == 2 && YYYY == 2019) sf = 16; 75 else if (MM == 5 && DD == 3) sf = 6; 76 else if (MM == 5 && DD == 4) sf = 7; 77 else if (MM == 5 && DD == 5) sf = 8; 78 else if (MM == 7 && x == 1 && DD >= 15 && DD <= 21) sf = 9; 79 else if (MM == 8 && DD == 11 && YYYY > 2015) sf = 17; 80 else if (MM == 9 && x == 1 && DD >= 15 && DD <= 21) sf = 10; 81 else if (MM == 9 && x == 2 && DD >= 16 && DD <= 22 82 && YYYY >= 2000 && YYYY <= 2020 83 && DD == syuubun[YYYY - 2000] - 1) sf = 16; 84 else if (MM == 9 && YYYY >= 2000 && YYYY <= 2030 85 && DD == syuubun[YYYY - 2000]) sf = 11; 86 else if (MM == 10 && x == 1 && DD >= 8 && DD <= 14) sf = 12; 87 else if (MM == 10 && DD == 22 && YYYY == 2019) sf = 19; 88 else if (MM == 11 && DD == 3) sf = 13; 89 else if (MM == 11 && DD == 23) sf = 14; 90 else if (MM == 12 && DD == 23 && YYYY < 2019) sf = 15; 91 else if (snext == 1) { snext = 0; document.write('<td bgcolor=deeppink><a href="' + document.URL + '" title="振替休日">'); } 92 else document.write('<td>'); 93 94 if (sf >= 1) { 95 document.write('<td bgcolor=hotpink>'); 96 document.write('<a href="' + document.URL + '" title="' + saijituNM[sf - 1] + '">'); 97 } 98 99 if (yyyy == YYYY && mm == MM && dd == DD) document.write('<font color=green><b>'); 100 else if (x == 0) document.write('<font color=red>'); 101 else if (x == 6) document.write('<font color=blue>'); 102 103 if (DD >= 1 && DD <= monthDay[MM - 1]) document.write(DD); 104 else document.write('<br>'); 105 106 if (yyyy == YYYY && mm == MM && dd == DD) document.write('</b></font>'); 107 else if (x == 0) document.write('</font>'); 108 else if (x == 6) document.write('</font>'); 109 110 if (sf >= 1) document.write('</a>'); 111 112 if (sf >= 1 && x == 0) snext = 1; 113 if (sf == 16) snext = 0; 114 115 document.write('</td>'); 116 } 117 document.write('</tr>'); 118 } 119 document.write('</table>'); 120} 121 122//---> 123</script> 124 125</head> 126 127<body> 128<center> 129<script language="JavaScript"> 130<!--- 131 132 now = new Date(); 133 YYYY = now.getYear() + 1900; 134 135 MM = now.getMonth() + 1; 136 137// if(MM < 4) YYYY = YYYY - 1; 138// MM = 4; 139 140 YYYY = 2019; 141 MM = 1; 142 143// MM = 7; 144 145document.write('<table border=1 cellspacing=0 bordercolor=blue>'); 146document.write('<tr ><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 147document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 148document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 149document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 150document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 151document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 152document.write('</td></tr>'); 153document.write('<tr ><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 154document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 155document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 156document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 157document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 158document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 159document.write('</td></tr>'); 160document.write('<tr ><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 161document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 162document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 163document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 164document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 165document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 166document.write('</td></tr>'); 167document.write('<tr ><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 168document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 169document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 170document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 171document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 172document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; } 173document.write('</td></tr>'); 174document.write('</table>'); 175 176//---> 177</script> 178</center> 179</body></html>

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

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

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

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

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

m.ts10806

2019/12/02 22:39

>要望いただいたので どこからですか? 回答者側ですか? いずれにしても質問ではなく作業依頼になっています。
maiko0318

2019/12/02 23:05

https://teratail.com/questions/226947 について回答者から >今どのようなコードになっているのかによって異なるかと思います. >出来るだけコードをご提示戴いた方が, 回答が付きやすいのではないでしょうか. と頂いたもので。
m.ts10806

2019/12/02 23:18

その質問編集してコードつければ良いだけでは? 新たに質問をたてる必要はないと思います
m.ts10806

2019/12/02 23:19

それに経緯も背景もなにもないのにいきなり「要望いただいた」から始まってると邪推にしか繋がらないですよ。
maiko0318

2019/12/02 23:25

ここは質問編集できるのですね。知りませんでした。 経緯を「要望いただいた」と表現したつもりですが、 意味がわからなかったらすみません。 質問がコロコロ変わったらわからなくならないですかね? 補足はともかく。
m.ts10806

2019/12/03 00:04

回答結構してて質問もしてきてて質問編集できることを知らないとは思わなかった…。 仰ってる前の回答も回答というより質問の追記修正依頼に近いです。
kyoya0819

2019/12/03 00:53

どこまでご自身の力でできたのですか?
maiko0318

2019/12/03 01:01

現在の処理は1ヶ月単位に、それも1日から月末方向に進んでいて 振替休日は「次の日」というフラグを持ってやりましたが、 「前の日」を祝日にすることができない仕組みになっています。 ちょこっといじったらいいのか、全面的に書き直さなければならないのか というところで止まっていて既出「3日間」案で進めてきましたが ロジックが浮かばずに困っております。
guest

回答3

0

祝日にはさまれた日はそもそもが祝日です

を元に、きちんと処理をしてください
(自動判定は意味がありません)

投稿2019/12/03 00:54

yambejp

総合スコア116690

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

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

kyoya0819

2019/12/03 08:54

質問文に書かれていませんか?
guest

0

いちいち計算するより、すなおに内閣府の出している CSV データを読み取ってテーブルに保存しといた方がよいかと思います。
※2年以上未来のカレンダー出したいとかなら別ですが


真面目に処理する場合、ある日が「祝日」となる条件は、

  1. 法律によって規定されている「祝日」である

 月日が固定されているもの、第○週の月曜日と規定されているもの、官報による告示で規定されるもの(春分の日・秋分の日)
2. その日が平日である場合、その日より「前」に祝日が連続し、その中に「日曜日である祝日」が含まれる(いわゆる振替休日)
3. その日の前後が祝日であり、かつその日が 1, 2 で規定された祝日ではない

ですから、これを各日ごとに処理してフラグ立てるなりしてください。

投稿2019/12/03 08:58

編集2019/12/03 09:25
tacsheaven

総合スコア13703

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

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

shinji709

2019/12/03 09:34

内閣府こんなの出してるんですね。さすがお役所Shift JIS
maiko0318

2019/12/03 13:04

即位の日(5/1)と即位礼正殿の儀(10/22)はただの「休日」扱いなんですね。 ちょっと笑っちゃいました。
tacsheaven

2019/12/06 02:22

Shift-JIS でないと Excel が読んだときに文字化けするんですよ。 ややこしいことに、平成の即位礼正殿の儀(1990/11/12)はただの休日なのですが、令和の即位礼正殿の儀は祝日扱いです(法令上で、令和の場合は国民の祝日に関する法律に規定される国民の祝日とみなして、一部法律を準用することが記されている)
guest

0

投稿2019/12/03 09:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問