ロゴ(青) ロゴ(緑)
  第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項に優先すると勝手に解釈します)』とし
て扱い、この点に関してはコード変更を行なわない事とします。




以下、各言語別に変更箇所を記します。
(注) 尚、ロジック紹介ページでは「変更により削除した部分(このページでは取消線)」を
        残さない形で掲載します(修正前後の履歴は、このページにまとめ、本体のコードに
        は余計なものを残さず綺麗な状態で掲載します)。
        また併せて、5月5日の祝日名が「子供の日」と漢字になっていましたので、この機会
        に『こどもの日』に修正します。

  VB/VBA Delphi JavaScript OOoBasic VBS PHP
  C Perl AWK Apollo Ruby JAVA



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祝日 = "こどもの日"
        '  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




Delphi 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ ktHolidayName ]    コメントのみ追加

    strHolidayName := prvHolidayChk(dtmDate);
    If (strHolidayName = '') then
        If (DayOfTheWeek(dtmDate) = DayMonday) then
            // 月曜以外は振替休日判定不要
            // 5/6(火,水)の判定はprvHolidayChkで処理済
            // 5/6(月)はここで判定する
            If (dtmDate >= EncodeDate(1973,4,12)) then
                begin
                    strHolidayName := prvHolidayChk(IncDay(dtmDate, -1));
                    If (strHolidayName <> '') then
                        Result := '振替休日'
                    else
                        Result := '';
                end

[ prvHolidayChk ]

    // 4月 //
        4:If (MyDay = 29) then
              Case MyYear of
                  2007..9999:
                      Result := '昭和の日';
                  1989..2006:
                      Result := 'みどりの日';
                  else
                      Result := '天皇誕生日';
              end

        //  If (MyYear >= 1989) then
        //      Result := 'みどりの日'
        //  else
        //      Result := '天皇誕生日'
          else
              If (MyDate = EncodeDate(1959,4,10)) then
                  Result := '皇太子明仁親王の結婚の儀'
              else;
  // 5月 //
        5:Case MyDay of
            3:Result := '憲法記念日';
            4:Case MyYear of
                  2007..9999:
                      Result := 'みどりの日';
                  1986..2006:
                      If (DayOfWeek(MyDate) > 2) then    // 日(1),月(2),火(3)...土(7)
                          // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
                          Result := '国民の休日'
                      else
                  else
              end
;
        //  4:If (DayOfWeek(MyDate) > 2) Then    // 日(1),月(2),火(3)...土(7)
        //      // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
        //      If (MyYear >= 1986) then
        //          Result := '国民の休日'
        //      else
        //    else;
            5:Result := 'こどもの日';
        //  5:Result := '子供の日';
            6:If (MyYear >= 2007) then
                  Case DayOfWeek(MyDate) of
                      3, 4: Result := '振替休日';    // [5/3,5/4が日曜]ケースのみ、ここで判定
                      else
                  end
              else;

          end;
  // 6月 //




JavaScript 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


MONDAY = 1;
TUESDAY = 2;
WEDNESDAY = 3;

[ ktHolidayName ]    コメントのみ追加

  HolidayName = prvHolidayChk(MyDate);
  if (HolidayName == "") {
      if (MyDate.getDay() == MONDAY) {
          // 月曜以外は振替休日判定不要
          // 5/6(火,水)の判定はprvHolidayChkで処理済
          // 5/6(月)はここで判定する
          if (MyDate.getTime() >= cstImplementHoliday.getTime()) {
              YesterDay = new Date(MyDate.getFullYear(),
                                    MyDate.getMonth(),(MyDate.getDate()-1));
              HolidayName = prvHolidayChk(YesterDay);
              if (HolidayName != "") {
                  HolidayName_ret = "振替休日";
              } else {
                  HolidayName_ret = "";
              }


[ prvHolidayChk ]

// 4月 //
  case 4:
      if (MyDay == 29) {
          if (MyYear >= 2007) {
              Result = "昭和の日";
          } else {

              if (MyYear >= 1989) {
                  Result = "みどりの日";
              } else {
                Result = "天皇誕生日";
              }
          }
      } else {
          // JavaScriptで扱える日付は1970/1/1〜のみなので下記は不要
          // if (MyDate.getTime() == cstAkihitoKekkon.getTime()) {
          //   Result = "皇太子明仁親王の結婚の儀";  // (=1959/4/10)
          // } else;

      }
      break;
// 5月 //
  case 5:
      if (MyDay == 3) {
          Result = "憲法記念日";
      } else {
          if (MyDay == 4) {
              if (MyYear >= 2007) {
                  Result = "みどりの日";
              } else {
                  if (MyYear >= 1986) {
                      if (MyDate.getDay() > MONDAY) {
                      // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
                          Result = "国民の休日";
                      } else;
                  } else;
              }

        //    if (MyDate.getDay() > MONDAY) {
        //    // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
        //        if (MyYear >= 1986) {
        //            Result = "国民の休日";
        //        } else;
        //    } else;
          } else {
              if (MyDay == 5) {
        //        Result = "子供の日";
                  Result = "こどもの日";
        //    } else;
              } else {
                  if (MyDay == 6) {
                      if (MyYear >= 2007) {
                          if ((MyDate.getDay() == TUESDAY) || (MyDate.getDay() == WEDNESDAY)) {
                              Result = "振替休日";    // [5/3,5/4が日曜]ケースのみ、ここで判定
                          } else;
                      } else;
                  } else;
              }

          }
      }
      break;
// 6月 //


※ 5月のネストが深くなり過ぎているので[ switch ]文に変更 ※

// 5月 //
  case 5:
      switch ( MyDay ) {
        case 3// 5月3日
          Result = "憲法記念日";
          break;
        case 4// 5月4日
          if (MyYear >= 2007) {
              Result = "みどりの日";
          } else {
              if (MyYear >= 1986) {
                  if (MyDate.getDay() > MONDAY) {
                  // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
                      Result = "国民の休日";
                  } else;
              } else;
          }

    //    if (MyDate.getDay() > MONDAY) {
    //    // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
    //        if (MyYear >= 1986) {
    //            Result = "国民の休日";
    //        } else;
    //    } else;
          break;
        case 5// 5月5日
    //    Result = "子供の日";
          Result = "こどもの日";
          break;
        case 6// 5月6日
          if (MyYear >= 2007) {
              if ((MyDate.getDay() == TUESDAY) || (MyDate.getDay() == WEDNESDAY)) {
                  Result = "振替休日";    // [5/3,5/4が日曜]ケースのみ、ここで判定
              } else;
          } else;
          break;

      }
      break;
// 6月 //




OpenOffice.org Basic 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ ktHolidayName ]

Const cstMonday As Integer = 2
Const cstTuesday As Integer = 3
Const cstWednesday As Integer = 4


    Case 4
        If (intDay = 29) Then
            If (intYear >= 2007) Then
                strHoliday = "昭和の日"
            ElseIf  (intYear >= 1989) Then

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

          ' If (Weekday(ChkDate) > cstMonday) Then
          ' ' 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
          '    If (intYear >= 1986) Then
          '        strHoliday = "国民の休日"
          '    End If
            End If
        ElseIf (intDay = 5) Then
            strHoliday = "こどもの日"
          ' strHoliday = "子供の日"
        ElseIf (intDay = 6) Then
            If (intYear >= 2007) Then
                Select Case Weekday(ChkDate)
                    Case cstTuesday, cstWednesday
                        strHoliday = "振替休日"    '[5/3,5/4が日曜]ケースのみ、ここで判定
                End Select
            End If

        End If
    Case 6

 (中略)

'【振替休日の判定】
    If (strHoliday = "") Then
        If (Weekday(ChkDate) = cstMonday) Then
            ' 月曜以外は振替休日判定不要
            ' 5/6(火,水)の判定は上記ステップで処理済
            ' 5/6(月)はここで判定する

            If (ChkDate >= cstImplementHolidayInLieu) Then
                If (ktHolidayName(ChkDate - 1) <> "") Then  '再帰呼出(月曜のみ)
                    ktHolidayName = "振替休日"
                Else
                    ktHolidayName = ""
                End If
            Else
                ktHolidayName = ""
            End If
        Else
            ktHolidayName = ""
        End If
    Else
        ktHolidayName = strHoliday
    End If
 End Function




VBS 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ ktHolidayName ]    コメントのみ追加

  strhdayn = prvhday(dtmhday)
  If (strhdayn = "") Then
    If (Weekday(dtmhday) = vbMonday) Then
      ' 月曜以外は振替休日判定不要
      ' 5/6(火,水)の判定はprvhdayで処理済
      ' 5/6(月)はここで判定する
      If (dtmhday >= cstsiko) Then
        strhdayn = prvhday(dtmhday - 1)
        If (strhdayn <> "") Then
          ktHolidayName = "振替休日"
        Else

[ prvhday ]

  Case 4
    If (inthi = 29) Then
      If (intnen >= 2007) Then
        prvhday = "昭和の日"
      ElseIf (intnen >= 1989) Then

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

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

    End If
  Case 6




PHP 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ ktHolidayName ]    コメントのみ追加

  $HolidayName = prvHolidayChk($MyDate);
  if ($HolidayName == "") {
      if (Weekday($MyDate) == MONDAY) {
          // 月曜以外は振替休日判定不要
          // 5/6(火,水)の判定はprvHolidayChkで処理済
          // 5/6(月)はここで判定する
          if ($MyDate >= $cstImplementHoliday) {
              $YesterDay = mktime(0,0,0,Month($MyDate),
                                      (Day($MyDate) - 1),Year($MyDate));
              $HolidayName = prvHolidayChk($YesterDay);
              if ($HolidayName != "") {
                  $Result = "振替休日";
              } else {
                  $Result = "";
              }


[ prvHolidayChk ]

  define("MONDAY","2");
  define("TUESDAY","3");
  define("WEDNESDAY","4");


  // 4月 //
  case 4:
      if ($MyDay == 29) {
          if ($MyYear >= 2007) {
              $Result = "昭和の日";
          } elseif ($MyYear >= 1989) {

      //  if ($MyYear >= 1989) {
              $Result = "みどりの日";
          } else {
              $Result = "天皇誕生日";
          }
      } elseif ($MyDate == $cstAkihitoKekkon) {
          $Result = "皇太子明仁親王の結婚の儀";
      } else;
      break;
  // 5月 //
  case 5:
      if ($MyDay == 3) {
          $Result = "憲法記念日";
      } elseif ($MyDay == 4) {
          if ($MyYear >= 2007) {
              $Result = "みどりの日";
          } elseif ($MyYear >= 1986) {
              if (Weekday($MyDate) > MONDAY) {
                  // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
                  $Result = "国民の休日";
              } else;
          } else;

      //  if (Weekday($MyDate) > MONDAY) {
      //      // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
      //      if ($MyYear >= 1986) {
      //          $Result = "国民の休日";
      //      } else;
      //  } else;
      } elseif ($MyDay == 5) {
          $Result = "こどもの日";
      //  $Result = "子供の日";
      } elseif ($MyDay == 6) {
          if ($MyYear >= 2007) {
              if ((Weekday($MyDate) == TUESDAY) || (Weekday($MyDate) == WEDNESDAY)) {
                  $Result = "振替休日";    // [5/3,5/4が日曜]ケースのみ、ここで判定
              } else;
          } else;

      } else;
      break;
  // 6月 //




C 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ Holiday ]

  case 4:
    if (dd==29){
      if (yy>=2007){
        r=5; /*昭和の日*/
      } else if (yy>=1989){

    /* if (yy>=1989){  */
        r=5; /*みどりの日*/
      } else {
        r=5; /*天皇誕生日*/
      }
    } else if ((yy==1959)&&(dd==10)){
      r=5; /*皇太子明仁親王の結婚の儀*/
    }
    break;
  case 5:
    if (dd==3){
      r=5; /*憲法記念日*/
    } else if (dd==4){
      /* if ((ww>1)&&(yy>=1986)){ */
      /*  r=3; /*国民の休日*/    */
      if (yy>=2007) {
        r=5; /*みどりの日*/
      } else if (yy>=1986) {
          /* 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)*/
          if (ww>1) {
            r=3; /*国民の休日*/
          }

      }
    } else if (dd==5) {
      r=5; /*こどもの日*/
    } else if (dd==6) {
      /* [5/3,5/4が日曜]ケースのみ、ここで判定 */
      if ((yy>=2007)&&((ww==2)||(ww==3))){
        r=4; /*振替休日*/
      }

    }
    break;
  case 6:

  (中略)

  case 12:
    if (dd==23){
      if (yy>=1989){
        r=5; /*天皇誕生日*/
      }
    }
  }

  if ((r<=3)&&(ww==1)){
    /*月曜以外は振替休日判定不要
        5/6(火,水)の判定は上記ステップで処理済
        5/6(月)はここで判定する  */

    if (t>=FURIKAE) {
      if (Holiday(t-86400)==5){    /* 再帰呼出 */
        r=4;
      }
    }
  }
  return r;
 }




Perl 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ Holiday ]

  } elsif ($mm==4){
    if ($dd==29){
      if ($yy>=2007){
        $r=5; # 昭和の日
      } elsif ($yy>=1989){

    # if ($yy>=1989){
        $r=5; # みどりの日
      } else {
        $r=5; # 天皇誕生日
      }
    } elsif (($yy==1959)&&($dd==10)){
      $r=5; # 皇太子明仁親王の結婚の儀
    }
  } elsif ($mm==5){
    if ($dd==3){
      $r=5; # 憲法記念日
    } elsif ($dd==4){
    # if (($ww>1)&&($yy>=1986)){
    #  $r=3; # 国民の休日
      if ($yy>=2007){
        $r=5; # みどりの日
      } elsif ($yy>=1986){
        # 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
        if ($ww>1) {
          $r=3; # 国民の休日
        }

      }
    } elsif ($dd==5){
      $r=5; # こどもの日
    } elsif ($dd==6) {
      # [5/3,5/4が日曜]ケースのみ、ここで判定
      if (($yy>=2007)&&(($ww==2)||($ww==3))){
        $r=4; # 振替休日
      }

    }
  } elsif ($mm==6){

  (中略)

  } elsif ($mm==12){
    if ($dd==23){
      if ($yy>=1989){
        $r=5; # 天皇誕生日
      }
    }
  }

  if (($r<=3)&&($ww==1)){
    # 月曜以外は振替休日判定不要
    # 5/6(火,水)の判定は上記ステップで処理済
    # 5/6(月)はここで判定する

    if ($t>=FURIKAE){
      if (&Holiday($t-86400)==5){  # 再帰呼出
        $r=4;
      }
    }
  }
  return $r;
 }




AWK 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ Holiday ]

  } else if (mm==4){
    if (dd==29){
      if (yy>=2007){
        r=5; # 昭和の日
      } else if (yy>=1989){

    # if (yy>=1989){
        r=5; # みどりの日
      } else {
        r=5; # 天皇誕生日
      }
    } else if ((yy==1959)&&(dd==10)){
      r=5; # 皇太子明仁親王の結婚の儀
    }
  } else if (mm==5){
    if (dd==3){
      r=5; # 憲法記念日
    } else if (dd==4){
    # if ((ww>1)&&(yy>=1986)){
    #  r=3; # 国民の休日
      if (yy>=2007){
        r=5; # みどりの日
      } else if (yy>=1986){
        # 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
        if (ww>1){
          r=3; # 国民の休日
        }

      }
    } else if (dd==5){
      r=5; # こどもの日
    } else if (dd==6) {
      # [5/3,5/4が日曜]ケースのみ、ここで判定
      if ((yy>=2007)&&((ww==2)||(ww==3))){
        r=4; # 振替休日
      }

    }
  } else if (mm==6){

  (中略)

  } else if (mm==12){
    if (dd==23){
      if (yy>=1989){
        r=5; # 天皇誕生日
      }
    }
  }

  if ((r<=3)&&(ww==1)){
      # 月曜以外は振替休日判定不要
      # 5/6(火,水)の判定は上記ステップで処理済
      # 5/6(月)はここで判定する

    if (t>=FURIKAE()){
      if (Holiday(t-86400)==5){  # 再帰呼出
        r=4;
      }
    }
  }
  return r;
 }




Apollo 用祝日判定コード 】  (青字が追加部分、変更方法の考え方
    併せて「曜日値(1〜3)の曜日定数(MONDAY等)への変更」他の修正も施します。


module Shukujitu

  MONDAY = 1
  TUESDAY = 2
  WEDNESDAY = 3



[ hurikae_kyujitu ]

  D_1973_4_12 = Phi::DateTime.new("1973/4/12")
  def self.hurikae_kyujitu? date
    # 月曜以外は振替休日判定不要
    # 5/6(火,水)の判定は[ kihon_shukujitu ]で処理済
    # 5/6(月)はここで判定する

  # return if date.wday != 1
  # return if date < "1973/4/12"
  # return '振替休日' if kihon_shukujitu? date.inc_day(-1)
  # return nil
    if ( date.wday == MONDAY ) && ( date >= D_1973_4_12 ) && ( kihon_shukujitu? date.inc_day(-1) )
      return '振替休日'
    end

  end

[ kihon_shukujitu ]

  D_1948_7_20 = Phi::DateTime.new("1948/7/20")
  def self.kihon_shukujitu? date
    date  = Phi::DateTime.new(date) unless date.is_a? Phi::DateTime
    date  = date.date
  # return if date < "1948/7/20"  # 祝日法施行前
    return if date < D_1948_7_20  # 祝日法施行前

  (中略)

    when 1
      return '元旦' if day == 1
      if year >= 2000
      # return '成人の日' if ( yobi == 1 ) && ( shuu == 2 )
        return '成人の日' if ( yobi == MONDAY ) && ( shuu == 2 )
      else

  (中略)

    when 4
      case day
    # when 29 ; return (year >= 1989) ? 'みどりの日' : '天皇誕生日'
      when 29
        case year
        when 2007..9999 ; return '昭和の日'
        when 1989..2006 ; return 'みどりの日'
        else                  ; return '天皇誕生日'
        end

      when 10 ; return '皇太子明仁親王の結婚の儀' if ( year == 1959 )
      end
    when 5
      case day
      when 3  ; return '憲法記念日'
      ## 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』,火曜〜土曜の場合に「国民の休日」
    # when 4  ; return '国民の休日' if ( year >= 1986 ) && ( yobi > 1 )
      when 4
        case year
        when 2007..9999 ; return 'みどりの日'
        when 1986..2006 ; return '国民の休日' if ( yobi > MONDAY )
                ## 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
        end

    # when 5  ; return '子供の日'
      when 5  ; return 'こどもの日'
      when 6  ; return '振替休日' if ( year >= 2007) && ([TUESDAY,WEDNESDAY].include? yobi)
                  ## [5/3,5/4が日曜]ケースのみ、ここで判定

      end
    when 6
      return '皇太子徳仁親王の結婚の儀' if (day == 9) && (year == 1993)
    when 7
      if year >= 2003
      # return '海の日' if ( shuu == 3) && (yobi == 1)
        return '海の日' if ( shuu == 3) && (yobi == MONDAY)
      elsif year >= 1996
        return '海の日' if day == 20
      end
    when 8
    when 9
      shuubun_day = shuubun_day(year)
      return '秋分の日'    if (shuubun_day == day)
      if year >= 2003
      # return '敬老の日'  if (yobi == 1) && (shuu == 3)
        return '敬老の日'  if (yobi == MONDAY) && (shuu == 3)
      # return '国民の休日' if (yobi == 2) && (day == shuubun_day - 1)
        return '国民の休日' if (yobi == TUESDAY) && (day == shuubun_day - 1)
      elsif year >= 1966
        return '敬老の日'  if (day == 15)
      end
    when 10
      if ( year >= 2000)
      # return '体育の日' if (yobi == 1) && (shuu == 2)
        return '体育の日' if (yobi == MONDAY) && (shuu == 2)
      elsif (year >= 1966)
        return '体育の日' if (day == 10)
      end
    when 11




Ruby 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ hurikae_kyujitu ]    コメントのみ追加

  def self.hurikae_kyujitu? date
    # 月曜以外は振替休日判定不要
    # 5/6(火,水)の判定は[kihon_shukujitu?]で処理済
    # 5/6(月)はここで判定する

    if ( date.wday == MONDAY ) && ( date >= D_1973_4_12 ) && ( kihon_shukujitu? date.inc_day(-1) )
      return '振替休日'
    end
  end


[ kihon_shukujitu ]

    when 4
      case day
    # when 29 ; return (year >= 1989) ? 'みどりの日' : '天皇誕生日'
      when 29
        case year
        when 2007..9999 ; return '昭和の日'
        when 1989..2006 ; return 'みどりの日'
        else            ; return '天皇誕生日'
        end

      when 10 ; return '皇太子明仁親王の結婚の儀' if year == 1959
      end

    when 5
      case day
      when 3  ; return '憲法記念日'
    # ## 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』,火曜〜土曜の場合に「国民の休日」。
    # when 4  ; return '国民の休日' if ( year >= 1986 ) && ( yobi > MONDAY )
      when 4
        case year
        when 2007..9999 ; return 'みどりの日'
        when 1986..2006 ; return '国民の休日' if ( yobi > MONDAY )
                # 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
        end

    # when 5  ; return '子供の日'
      when 5  ; return 'こどもの日'
      when 6  ; return '振替休日' if (year >= 2007 ) and ([TUESDAY,WEDNESDAY].include? yobi)
                # '[5/3,5/4が日曜]ケースのみ、ここで判定

      end

    when 6




JAVA 用祝日判定コード 】  (青字が追加部分、変更方法の考え方


[ getHolidayName ]    コメントのみ追加

  if ( HolidayName.equals("") ) {
      if ( MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.MONDAY ) {
          // 月曜以外は振替休日判定不要
          // 5/6(火,水)の判定は[ prvHolidayChk ]で処理済
          // 5/6(月)はここで判定する

          if ( MyDate.after( cstImplementHoliday ) || MyDate.equals( cstImplementHoliday ) ) {
              Calendar YesterDay = (Calendar )MyDate.clone();
              YesterDay.add( Calendar.DATE, -1 );
              HolidayName = prvHolidayChk( YesterDay );
              HolidayName_ret = "";
              if ( !HolidayName.equals("") ) {
                  HolidayName_ret = "振替休日";


[ prvHolidayChk ]

    // 4月 //
        case 4:
            if ( MyDay == 29 ) {
                if (MyYear >= 2007) {
                    Result = "昭和の日";
                } else {

                    if ( MyYear >= 1989 ) {
                        Result = "みどりの日";
                    } else {
                        Result = "天皇誕生日";
                    }
                }
            } else {
                if ( MyDate.equals( cstAkihitoKekkon ) ) {
                    Result = "皇太子明仁親王の結婚の儀";  // ( =1959/4/10 )
                } else;
            }
            break;
    // 5月 //
        case 5:
            if ( MyDay == 3 ) {
                Result = "憲法記念日";
            } else {
                if ( MyDay == 4 ) {
                    if (MyYear >= 2007) {
                        Result = "みどりの日";
                    } else {
                        if (MyYear >= 1986) {
                            if (MyDate.get( Calendar.DAY_OF_WEEK ) > Calendar.MONDAY) {
                                // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
                                Result = "国民の休日";
                            } else;
                        } else;
                    }

            //    if ( MyDate.get( Calendar.DAY_OF_WEEK ) > Calendar.MONDAY ) {
            //    // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
            //        if ( MyYear >= 1986 ) {
            //            Result = "国民の休日";
            //        } else;
            //    } else;
                } else {
                    if ( MyDay == 5 ) {
                    // Result = "子供の日";
                        Result = "こどもの日";
                //  } else;
                    } else {
                        if (MyDay == 6) {
                            if (MyYear >= 2007) {
                                if ( (MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.TUESDAY)
                                      || (MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.WEDNESDAY) ) {
                                    Result = "振替休日";    // [5/3,5/4が日曜]ケースのみ、ここで判定
                                } else;
                            } else;
                        } else;
                    }

                }
            }
            break;
    // 6月 //


※ 5月のネストが深くなり過ぎているので[ switch ]文に変更 ※

    // 5月 //
        case 5:
            switch ( MyDay ) {
              case 3// 5月3日
                  Result = "憲法記念日";
                  break;
              case 4// 5月4日
                  if (MyYear >= 2007) {
                      Result = "みどりの日";
                  } else {
                      if (MyYear >= 1986) {
                          if (MyDate.get( Calendar.DAY_OF_WEEK ) > Calendar.MONDAY) {
                              // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』(〜2006年)
                              Result = "国民の休日";
                          } else;
                      } else;
                  }

            //  if ( MyDate.get( Calendar.DAY_OF_WEEK ) > Calendar.MONDAY ) {
            //  // 5/4が日曜日は『只の日曜』、月曜日は『憲法記念日の振替休日』
            //      if ( MyYear >= 1986 ) {
            //          Result = "国民の休日";
            //      } else;
            //  } else;
                  break;
              case 5// 5月5日
              // Result = "子供の日";
                  Result = "こどもの日";
                  break;
              case 6// 5月6日
                  if (MyYear >= 2007) {
                      if ( (MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.TUESDAY)
                          || (MyDate.get( Calendar.DAY_OF_WEEK ) == Calendar.WEDNESDAY) ) {
                          Result = "振替休日";    // [5/3,5/4が日曜]ケースのみ、ここで判定
                      } else;
                  } else;
                  break;

            }
            break;
    // 6月 //





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

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

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