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

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

ただいまの
回答率

90.00%

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

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 230

maiko0318

score 524

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

<html>

<head>

<title></title>

<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">

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

function cal(YYYY, MM){
    monthDay  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
//    monthName = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
    monthName = new Array("1-睦月","2-如月","3-弥生","4-卯月","5-皐月","6-水無月","7-文月","8-葉月","9-長月","10-神無月","11-霜月","12-師走");
    saijituNM = new Array("元日","成人の日:第2月曜日","建国記念の日","春分の日","昭和の日","憲法記念日","みどりの日","こどもの日","海の日:第3月曜日","敬老の日:第3月曜日","秋分の日","体育の日:第2月曜日","文化の日","勤労感謝の日","天皇誕生日","国民の休日","山の日","即位の礼","即位正殿の儀");
    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);
    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);

    sf = 0; snext = 0;

    now  = new Date();
    yyyy = now.getYear() + 1900;
    mm   = now.getMonth()+1;
    dd   = now.getDate();

    YYYY1 = Math.floor(YYYY / 4);
    YYYY2 = Math.floor(YYYY / 100);
    YYYY3 = Math.floor(YYYY / 400);

    if (YYYY != YYYY1 * 4) monthDay[1] = 28;
    else
        if (YYYY != YYYY2 * 100) monthDay[1] = 29;
        else
            if (YYYY != YYYY3 * 400) monthDay[1] = 28;
            else monthDay[1] = 29;

    leftUP = - YYYY - YYYY1 + YYYY2 - YYYY3;
    if (monthDay[1] == 29) leftUP = leftUP + 1;

    for (i = 0; i < MM - 1; i++){
        leftUP = leftUP - monthDay[i];
    }

    leftUP1 = Math.ceil(leftUP / 7);
    leftUP = leftUP - leftUP1 * 7;

    document.write('<table border=1 cellspacing=0 bordercolor=white>');

//    document.write('<tr align=center><td colspan=7>' + YYYY + '年' + MM + '月' + '</td></tr>');

    document.write('<tr><td colspan=2 align=center>' + YYYY + '</td>');
    document.write('<td colspan=5 align=right>' + monthName[MM - 1] + '</td></tr>');

    document.write('<tr align=center><td><font color=red>日</font></td><td>月</td><td>火</td>');
    document.write('<td>水</td><td>木</td><td>金</td><td><font color=blue>土</font></td></tr>');

    for (y = 0; y < 6; y++){
        document.write('<tr align=center>');

        for (x = 0; x < 7; x++){
            DD = leftUP + y * 7 + x + 1;
            sf = 0;
            if (MM == 1 && DD == 1)                             sf = 1;
            else if (MM == 1 && x == 1 && DD >= 8 && DD <= 14)  sf = 2;
            else if (MM == 2 && DD == 11)                       sf = 3;
            else if (MM == 2 && DD == 23 && YYYY > 2019)        sf = 15;
            else if (MM == 3 && YYYY >= 2000 && YYYY <= 2030
                     && DD == syunbun[YYYY - 2000])             sf = 4;
            else if (MM == 4 && DD == 29)                       sf = 5;
            else if (MM == 4 && DD == 30 && YYYY == 2019)       sf = 16;
            else if (MM == 5 && DD == 1  && YYYY == 2019)       sf = 18;
            else if (MM == 5 && DD == 2  && YYYY == 2019)       sf = 16;
            else if (MM == 5 && DD == 3)                        sf = 6;
            else if (MM == 5 && DD == 4)                        sf = 7;
            else if (MM == 5 && DD == 5)                        sf = 8;
            else if (MM == 7 && x == 1 && DD >= 15 && DD <= 21) sf = 9;
            else if (MM == 8 && DD == 11 && YYYY > 2015)        sf = 17;
            else if (MM == 9 && x == 1 && DD >= 15 && DD <= 21) sf = 10;
            else if (MM == 9 && x == 2 && DD >= 16 && DD <= 22
                     && YYYY >= 2000 && YYYY <= 2020
                     && DD == syuubun[YYYY - 2000] - 1)         sf = 16;
            else if (MM == 9 && YYYY >= 2000 && YYYY <= 2030
                     && DD == syuubun[YYYY - 2000])             sf = 11;
            else if (MM == 10 && x == 1 && DD >= 8 && DD <= 14) sf = 12;
            else if (MM == 10 && DD == 22 && YYYY == 2019)      sf = 19;
            else if (MM == 11 && DD == 3)                       sf = 13;
            else if (MM == 11 && DD == 23)                      sf = 14;
            else if (MM == 12 && DD == 23 && YYYY < 2019)       sf = 15;
            else if (snext == 1) { snext = 0; document.write('<td bgcolor=deeppink><a href="' + document.URL + '" title="振替休日">'); }
            else document.write('<td>');

            if (sf >= 1) {
                document.write('<td bgcolor=hotpink>');
                document.write('<a href="' + document.URL + '" title="' + saijituNM[sf - 1] + '">');
            }

            if (yyyy == YYYY && mm == MM && dd == DD) document.write('<font color=green><b>');
            else if (x == 0) document.write('<font color=red>');
            else if (x == 6) document.write('<font color=blue>');

            if (DD >= 1 && DD <= monthDay[MM - 1]) document.write(DD);
            else                                   document.write('<br>');

            if (yyyy == YYYY && mm == MM && dd == DD) document.write('</b></font>');
            else if (x == 0) document.write('</font>');
            else if (x == 6) document.write('</font>');

            if (sf >= 1) document.write('</a>');

            if (sf >= 1 && x == 0) snext = 1;
            if (sf == 16) snext = 0;

            document.write('</td>');
        }
        document.write('</tr>');
    }
    document.write('</table>');
}

//--->
</script>

</head>

<body>
<center>
<script language="JavaScript">
<!---

    now  = new Date();
    YYYY = now.getYear() + 1900;

    MM   = now.getMonth() + 1;

//    if(MM < 4) YYYY = YYYY - 1;
//    MM = 4;

      YYYY = 2019;
      MM   = 1;

//      MM   = 7;

document.write('<table border=1 cellspacing=0 bordercolor=blue>');
document.write('<tr ><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td></tr>');
document.write('<tr ><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td></tr>');
document.write('<tr ><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td></tr>');
document.write('<tr ><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td><td valign="top">');cal(YYYY, MM);MM = MM + 1; if(MM > 12) { YYYY++; MM = 1; }
document.write('</td></tr>');
document.write('</table>');

//--->
</script>
</center>
</body></html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/12/03 09:04

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

    キャンセル

  • asuchi0819

    2019/12/03 09:53

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

    キャンセル

  • maiko0318

    2019/12/03 10:01

    現在の処理は1ヶ月単位に、それも1日から月末方向に進んでいて
    振替休日は「次の日」というフラグを持ってやりましたが、
    「前の日」を祝日にすることができない仕組みになっています。

    ちょこっといじったらいいのか、全面的に書き直さなければならないのか
    というところで止まっていて既出「3日間」案で進めてきましたが
    ロジックが浮かばずに困っております。

    キャンセル

回答 3

+6

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/03 17:54

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

    キャンセル

+3

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/03 18:34

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

    キャンセル

  • 2019/12/03 22:04

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

    キャンセル

  • 2019/12/06 11:22

    Shift-JIS でないと Excel が読んだときに文字化けするんですよ。

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

    キャンセル

+2

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る