ロゴ(青) ロゴ(緑)

祝日ロジックの修正方針(振替休日 , 国民の休日)

        ( 2005/5/20 : 初版 (振替休日) , 2018/12/8 : 2019年GW の 国民の休日 を追記 )


1.  2007年(平成17年)制定の 「昭和の日」 改正に伴う【振替休日】の判定方法について
2.  2018年(平成30年)制定の 「即位に伴う 2019年の臨時祝日」 改正に伴う 【 4/29〜5/3 の連休 】の判定方法について


[ この場所へのリンク ]

1. 2007年(平成17年)制定の「昭和の日」改正に伴う【振替休日】の判定方法について

  第162回国会で成立した「昭和の日」改正祝日法 に伴う 祝日判定ロジック の変更について、
その修正方針を説明します。

   ( 改正祝日法 条文 )

  国民の祝日に関する法律(昭和二十三年法律第百七十八号)の一部を次のように改正する。
  第二条みどりの日の項を次のように改める。
          昭和の日 四月二十九日 激動の日々を経て、復興を遂げた昭和の時代を顧み、
          国の将来に思いをいたす。
  第二条憲法記念日の項の次に次のように加える。
          みどりの日 五月四日 自然に親しむとともにその恩恵に感謝し、豊かな心をはぐくむ。
  第三条第二項中
          「あたるときは、その翌日」 を
          「当たるときは、その日後においてその日に最も近い 「国民の祝日」 でない日」
  に改め、同条第三項中
          「日曜日にあたる日及び前項に規定する休日にあたる日を除く。」  を
          「「国民の祝日」でない日に限る。」
  に改める。

  附 則
        この法律は、平成十九年一月一日から施行する。


  振替休日の判定は、新しい条文の文言をそのまま忠実に仕様化するとすれば、
      指定日が「祝日ではない」場合に
      その前日から順次1日ずつ遡りながら、「祝日か」そして「日曜日か」を調べ、
      日曜日に当たれば【指定日は振替休日】
      日曜日に当たる事無く「祝日でない」日に至れば【指定日は平日】

というものになります(そのまま忠実に実装しようとすれば[再帰呼び出し]風な作りにな
ると思います)。今までは、
      指定日が「祝日ではない」場合で、且つ「月曜日」であった場合にのみ
      「前日の日曜日が祝日か」を調べ、
      祝日であれば【指定日は振替休日】
      祝日でなければ【指定日は平日】

という判定で充分でした。今後は「月曜〜土曜」全ての日付で「振替休日か?」という
判定を求められるという事になります(文言通りに忠実に行なうならですが‥‥)。

  1年365日の内、祝日は15日程度です。つまり、96%は「祝日でない」日です。

  今までは、一度「祝日判定」を行なった(祝日でないと判った)後に、月曜日について
のみ(即ち七分の一)、再度「祝日判定を実施すれば用が済んでいました。したがって、
1年365日を連続して判定するような場合(営業日計算など)に、繰り返し祝日判定を実
施しなければ結果が出ないのは14%(50日)程度でした。
   しかし、改正後では振替休日の候補は月曜日に限ったものではなく、月〜土曜全て
が候補になります(現状は月〜水までですが、条文通りに解釈すれば月〜土です)。
つまり、今後は96%の「祝日でない」日の全てについて『繰り返し祝日判定を実施しな
ければ結果が出ない』という事になります。
  今まで、「1日につき、ほぼ1回の判定」で済んでいたのが、改正後では「1日につき、
ほぼ2回の判定」を要する事になる訳です。処理量として2倍になる訳ですね。
  これでは、『出来るだけ少ない条件判断で判定を下す』というスタンスでロジックを作って
来た考えに反してしまいます。

  そこで、AddinBox で提供する祝日判定ロジックでは、
    (a) 現実的に唯一発生する『5月6日』のみ特別扱いする。
    (b) 5月5日(こどもの日)が日曜日の場合に、5月6日(月曜)が振替休日となるのは
         旧来通りなので、これはそのまま従来の振替休日判定で処理する。
    (c) 残る、5月3日(憲法記念日)と5月4日(みどりの日)が日曜日になるケースを
         他の祝日と同列にして判断する事とする。
    (d) 5月3日/4日が日曜日という事は、即ち【5月6日が水曜または火曜】になる事と
         同義なので、判断条件は『5月6日が火曜 or 水曜ならば振替休日』とする。
    (e) 5月6日(火・水)を除外できたので、「振替休日」判定そのものは従来通りに「月
         曜のみ」の条件で実行する。

という扱い方をします。

  これによって、改正前と比べて負荷が増えるというような問題を解消できます。なお、将来
「連続する祝日」が新たに増えた場合には、今回と同様に扱うよう、増えた時点でロジック
修正を行なう事とします。

--- 振替休日 と 祝日に挟まれた日(国民の休日) のバッティング について ---
  改正による変更では他に、「国民の休日」と「振替休日」の条件がバッティングした場合、
条文上、どちらを採るかという点が曖昧になってしまいました。
  当面、このようなケースには遭遇しませんが、仕様の観点から「どちらが優位か」という事を
明確にしておかないと困りますので、従来通りに『振替休日が優位(2項は3項に優先すると
勝手に解釈します
)』として扱い、この点に関してはコード変更を行なわない事とします。


VB/VBA 用祝日判定マクロ 】  (青字(+)が追加部分、字消(-)が削除部分)


[ ktHolidayName ]    コメントのみ追加

    If (str祝日名 = "") Then
        If (Weekday(dtm日付) = vbMonday) Then
            ' 月曜以外は振替休日判定不要
 +          ' 5/6(火,水)の判定は[prv祝日]で処理済
 +          ' 5/6(月)はここで判定する
            If (dtm日付 >= cst振替休日施行日) Then
                str祝日名 = prv祝日(dtm日付 - 1)
                If (str祝日名 <> "") Then
                    ktHolidayName = "振替休日"

[ prv祝日 ]

    Case 4
        If (int日 = 29) Then
 +          If (int年 >= 2007) Then
 +              prv祝日 = "昭和の日"
 +          ElseIf  (int年 >= 1989) Then

 -          If  (int年 >= 1989) Then
                prv祝日 = "みどりの日"
            Else
                prv祝日 = "天皇誕生日"
            End If
        ElseIf (日付 = cst明仁親王の結婚の儀) Then
            prv祝日 = "皇太子明仁親王の結婚の儀"
        End If
    Case 5
        If (int日 = 3) Then
            prv祝日 = "憲法記念日"
        ElseIf (int日 = 4) Then
 +          If (int年 >= 2007) Then
 +              prv祝日 = "みどりの日"
 +          ElseIf (int年 >= 1986) Then
 +              ' 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
 +              If (Weekday(日付) > vbMonday) Then
 +                  prv祝日 = "国民の休日"
 +              End If

 -          If (Weekday(日付) > vbMonday) Then
 -              ' 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
 -              If (int年 >= 1986) Then
 -                  prv祝日 = "国民の休日"
 -              End If
            End If
        ElseIf (int日 = 5) Then
            prv祝日 = "こどもの日"
 +      ElseIf (int日 = 6) Then
 +          If (int年 >= 2007) Then
 +              Select Case Weekday(日付)
 +                  Case vbTuesday, vbWednesday
 +                      prv祝日 = "振替休日"    '[5/3,5/4が日曜]ケースのみ、ここで判定
 +              End Select
 +          End If

        End If
    Case 6




[ この場所へのリンク ]

2. 2018年(平成30年)制定の「即位に伴う 2019年の臨時祝日」改正
    に伴う【 4/29〜5/3 の連休 】の判定方法について


  第197回国会で成立した「天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律」
伴う 祝日判定ロジック の変更について、その修正方針を説明します。

   「 天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律 」

  天皇の即位の日及び即位礼正殿の儀の行われる日は、休日とする。

  附則
    (施行期日等)
    第一条
        この法律は、公布の日から施行し、天皇の退位等に関する皇室典範特例法(平成二十九年法律
        第六十三号)第二条の規定による天皇の即位に関して適用する。

    (他の法令の適用)
    第二条
        本則の規定により休日となる日は、国民の祝日に関する法律(昭和二十三年法律第百七十八号)
        に規定する国民の祝日として、同法第三条第二項及び第三項の規定の適用があるものとする
                                              ( [ 振替休日 / 祝日に挟まれた平日が休日になる ] 条項の適用 )
    2
        本則及び前項の規定により休日となる日は、他の法令(国民の祝日に関する法律を除く。)の規定
        の適用については、同法に規定する休日とする
                                ( 他の法律で [ 休日 ] と記述されている部分には、本法律の休日も含まれる )

    --- 以下、略 ---


  この法律で、2019年5月1日が「即位の日」という【祝日】となります。これに伴い、4月30日 および 5月2日
【祝日に挟まれる平日】として「国民の休日」になります(2019年 限り)。



( a ) 祝日に挟まれて「国民の休日」となる
          4月30日(平成天皇の退位の日) および 5月2日
      は特定日として処理します。『祝日に挟まれる』というロジックは組みません。

( b ) 5月1日(即位の日) および 5月2日 の特定日判定については、平日日付に対する判定ステップの
      回数を1回でも少なくする為に、先に「年( = 2019)」で振り分けを行ないます。

( c ) 祝日名/休日名 および 英語名は下記の通りとします。
          ・ 2019/4/30 : "国民の休日"  ,  "Citizen's Holiday"
          ・ 2019/5/1 : "即位の日"  ,  "The Enthronement day of HIH Crown Prince Naruhito"
          ・ 2019/5/2 : "国民の休日"  ,  "Citizen's Holiday"
          ・ 2019/10/22 : "即位礼正殿の儀"   ,  "The Ceremony of the Enthronement of His Majesty the Emperor (at the Seiden)"
      補:「即位礼正殿の儀」の英語名は 宮内庁に確認した正式なもの です。

VB/VBA 用祝日判定マクロ 】  (青字(+)が追加部分、字消(-)が削除部分)


    Const cst祝日法施行 As Date = "1948/7/20"
    Const cst昭和天皇の大喪の礼 As Date = "1989/2/24"
    Const cst明仁親王の結婚の儀 As Date = "1959/4/10"
    Const cst徳仁親王の結婚の儀 As Date = "1993/6/9"
    Const cst即位礼正殿の儀 As Date = "1990/11/12"
 +  Const cst平成天皇の退位 As Date = "2019/4/30"    '祝日ではなく「国民の休日」です
 +  Const cst徳仁親王の即位 As Date = "2019/5/1"
 +  Const cst2019GW国民の休日 As Date = "2019/5/2"    '祝日ではなく「国民の休日」です
 +  Const cst即位礼正殿の儀_徳仁親王 As Date = "2019/10/22"



[ prv祝日 ]

    '-- 4月 --
    Case 4
        If (int日 = 29) Then
            If (int年 >= 2007) Then
                prv祝日 = "昭和の日"
            ElseIf (int年 >= 1989) Then
                prv祝日 = "みどりの日"
            Else
                prv祝日 = "天皇誕生日"    ' 昭和天皇
            End If
 +      ElseIf (日付 = cst平成天皇の退位) Then    ' 2019/4/30
 +          prv祝日 = "国民の休日"    '祝日に挟まれた国民の休日です

        ElseIf (日付 = cst明仁親王の結婚の儀) Then    ' 1959/4/10
            prv祝日 = "皇太子明仁親王の結婚の儀"
        End If

    '-- 5月 --
    Case 5
        If (int日 = 3) Then
            prv祝日 = "憲法記念日"
        ElseIf (int日 = 4) Then
            If (int年 >= 2007) Then
                prv祝日 = "みどりの日"
            ElseIf (int年 >= 1986) Then
                ' 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
                If (Weekday(日付) > vbMonday) Then    ' 火曜 以降(火〜土)
                    prv祝日 = "国民の休日"
                End If
            End If
        ElseIf (int日 = 5) Then
            prv祝日 = "こどもの日"
        ElseIf (int日 = 6) Then
            If (int年 >= 2007) Then
                Select Case Weekday(日付)
                    Case vbTuesday, vbWednesday
                        prv祝日 = "振替休日"    ' [5/3,5/4が日曜]ケースのみ、ここで判定
                End Select
            End If
 +      Else
 +          If (int年 = 2019) Then
 +              If (日付 = cst徳仁親王の即位) Then    ' 2019/5/1
 +                  prv祝日 = "即位の日"    ' 徳仁親王
 +              ElseIf (日付 = cst2019GW国民の休日) Then    ' 2019/5/2
 +                  prv祝日 = "国民の休日"    '祝日に挟まれた国民の休日です
 +              End If
 +          End If

        End If

    '-- 6月 --


    '-- 10月 --
    Case 10
        str第N曜日 = (((int日 - 1) \ 7) + 1) & Weekday(日付)
            Select Case int年
                Case Is >= 2021
                    If (str第N曜日 = "22") Then    ' 2nd Monday(2)
                        prv祝日 = "スポーツの日"    ' 2020年より改名
                    End If
                Case 2020
                    ' 2020年はオリンピック特措法により「スポーツの日」が 7/24 に移動
                Case Is >= 2000
                    If (str第N曜日 = "22") Then    ' 2nd Monday(2)
                        prv祝日 = "体育の日"
 +                  ElseIf (日付 = cst即位礼正殿の儀_徳仁親王) Then
 +                      prv祝日 = "即位礼正殿の儀"    ' 徳仁親王(2019/10/22)

                    End If
                Case Is >= 1966
                    If (int日 = 10) Then
                        prv祝日 = "体育の日"
                    End If
                Case Else
            End Select

    '-- 11月 --






[ Home へ戻る ]    [ 祝日ロジック へ戻る ]

ロゴ(ゴールド) ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2004 Allrights Reserved.