AddinBox(Title_Logo)

  -- Page 2 --

      VBAおよびVB用の祝日判定用マクロ[関数](『kt関数アドイン/kt祝日名取得』の
  ロジックと同じものです)を公開しています。また、VBA用の祝日判定用マクロ[関数]を
  基にして、他言語向けに編集移植したコードを頂きましたので、併せて、このページで
  公開します。

      なお、祝日に関する詳細情報こちらのページをご覧下さい。

      VBA用コードは純粋にVB構文だけ(エクセル独自の機能は使ってません)で作って
    ありますので、エクセルだけでなくアクセスや、その他のVBAを使うアプリケーション
    でも利用できます。
  ※ 重要 ※
    ・ [ 東京五輪 祝日移動(2021年) ]  (2020/11/28)
      東京五輪特措法により2021年の「海の日/山の日/スポーツの日」が移動となります。

 
  ※ 訂正案内 2021/6/13 ※
    Ruby および Apollo で 2020/2021年の「山の日」判定に誤りがありましたので修正しました。
    修正箇所の説明は各言語版の項に記してあります。



※VBA以外に移植したコードも紹介しています※
 ・ 「東京五輪 祝日移動(2021年)」 改正への対応済みです。 (2020/11/28)

   [ 旧サイト ( DIONサーバー ) の Internet Archive ( Page 2 ) ]
      -頁-
  ・ 祝日判定マクロ の 設計方針について
  ・ And / Or 演算子 : 完全評価( Complete )型 と 短絡評価( Short-circuit )型
  ・ オーソドックス な 「表引き」 手法との比較
  ・ 祝日判定の拡張 ( 土日も含める 等 ) について
  ・ 拡張マクロ : 銀行休日の判定
  ・ 5月6日 ( 振替休日 ) の判定方法について
  ・ 2019年GWの休日(4/30,5/1,5/2) の判定方法について
  ・ ( 番外 ) 新元号対応 日付変換関数 EraFormat / EraCDate
 
1
--言語-- -- 移  植 -- -公開日- -頁-
VB/VBA AddinBox(角田) 2002/ 3/16 1
Delphi AddinBox(角田) 2002/11/22
JavaScript AddinBox(角田) 2003/ 5/ 9
OOoBasic AddinBox(角田) 2005/ 4/15

VB2005 Fukuchi さん 2006/ 7/ 4 2
VBS 立野 徹 さん 2003/ 3/ 2
PHP 代理店どっとこむ「中野」 さん 2003/ 5/ 6

C こほろぎ AsaPi! さん 2003/ 3/ 2 3
C# 小山 隆史 さん 2005/12/17
Perl 富士ソフトサービスビューロ(株)
    BS部 「稲葉」 さん
2003/ 6/ 9
AWK 富士ソフトサービスビューロ(株)
    BS部 「稲葉」 さん
2003/ 6/11

Apollo たけ(tk) さん 2003/ 9/24 4
Ruby たけ(tk) さん 2005/ 4/15
JAVA 阿蛭 栄一 さん 2003/12/21

Transact-SQL シリコンブレス  有方 公一 さん 2006/ 8/ 1 5
PL/SQL 菅 康明 さん 2006/12/ 1
Python 瀬戸口 光宏 さん 2007/ 5/28

ActionScript 3 stocksrc.com  2010/ 3/23 6
Go 言語 杉田 臣輔 さん 2015/ 1/ 6
Scala gakuzzzz さん 2019/ 1/17
       
      自由に各自のプログラムに組み込んで利用して下さい。なお、フリー/シェアソフト
    開発での利用も可(フリー/シェアでの利用の場合、事後で結構ですので一言
    お知らせください)です。ただし、引用に当たっては、マクロの先頭に記述してある
        コメント(CopyRight )を必ず一緒に引用する事

    を条件とします。

      なお、他サイト上で本コードを直接引用する事は、ご遠慮願います。本ページへの
    リンクによる紹介で対応して下さい。

      [ktHolidayName]という関数名そのものは、各自の環境における命名規則に沿って
    変更しても構いません
      VBA(VB含む)で利用する場合はマクロのコード構成を一切変更しないでください。
    VBAというレスポンス的に不利な言語でも出来る限りレスポンスを良くする事を前提に
    設計してある為、コード内容を変更するとレスポンスが低下する可能性があります

      VBA以外の言語に移植する場合は、その言語の特性に合わせたベストなコード構成
    変更しても構いません。

    また、出来上がったものをご連絡頂ければ、このページにて紹介させて貰います。

    尚、移植に際しては、And/Orによる条件演算、および[春分の日/秋分の日]算出式の
    INT演算について各言語特性に留意して下さい。また、表引き手法を採らない理由
    御一読ください。



[ Note ]
  Access などで、[Null値]を受け取る/返すといった必要がある場合には、下記のように
『ktHolidayName 』の外側に、もうひとつ関数を被せるようにする事で『ktHolidayName 』
自体は変更せずに利用する事ができます(この場合には、ktHolidayName は'Private'に
して下さい)。尚、下記はVBA(VB)コードによる例です。

Public Function 祝日名(ByVal 日付 As Variant) As Variant
  If IsDate(日付) Then
        祝日名 = ktHolidayName(CDate(日付))
    Else
        祝日名 = Null
    End If
End Function

  その他に「銀行休日」で「土日休み」部分も一緒にフォローしたいといった場合でも
同様の方法で対応できます。

Public Function 祝日_土日(ByVal 日付 As Date) As String
    祝日_土日 = ktHolidayName(日付)
    If (祝日_土日 = "") Then
        Select Case Weekday(日付)
            Case vbSunday: 祝日_土日 = "日"
            Case vbSaturday: 祝日_土日 = "土"
            Case Else
        End Select
    End If
End Function

  このようにする事で[ktHolidayName]のロジック自体を変更せずに、様々な条件を付け加える
事が可能です。引用する際には[ktHolidayName]そのものには手を加えずに、コメントを含めて
丸々コピーするようにしてください。
  ktHolidayName/prv祝日 の内部に処理を追加してしまうと、将来再び祝日法が変更された
場合に、新しいktHolidayName/prv祝日上書き修正により、追加した処理が消えてしま
います。そうならない為にも、ktHolidayName/prv祝日には手を加えずに、その外側にプロシ
ジャーを用意して、そこで機能追加を施すようにして下さい。



[ この場所へのリンク ]


 【 VB2005 用祝日判定コード 】    [ 検証用データ ( 祝日一覧 ) は JavaScript 版による ツール で取得できます ]  [ 不具合報告 メール送信 ]
  2006/7/4 追記( [昭和の日]改正 対応済 )
  2014/5/29 [山の日]改正 の修正
  2018/2/15 [天皇誕生日の変更]改正 の修正
  2018/6/21 [体育の日⇒スポーツの日 改名] & [五輪特措法による祝日移動(2020年)] 改正の修正
  2018/12/8 [即位の日 および 4/30 & 5/2の国民の休日] [即位礼正殿の儀] 改正の修正
  2020/11/28 [五輪特措法による祝日移動(2021年)] 改正の修正

    VBAコードのロジックを、そのまま[VB2005 ]用に書き直したものです。
    「Fukuchi」さんによる編集です。
    VBAとの違いは、以下の通りです。
        (1) 日付定数の定義を日付文字列ではなく日付リテラルにより行なう
        (2) 日付から年/月/日を取り出すには、日付オブジェクトに対するYearプロパティ等で行なう
        (3) 日付の加減算は、日付オブジェクトに対するAddDaysメソッドで行なう
        (4) Fix関数の結果をInteger型に代入するには、CInt関数による型変換が必要

    土日なども一緒に判定するなど条件を付加する場合は、こちらの解説を参考にして下さい。

    『祝日について

    「昭和の日」に伴う「振替休日(5月6日)」改正への修正方針もお読みください。
    「即位の日(2019/5/1)」に伴う「祝日に挟まれた平日(4/30 & 5/2)の休日化」への修正方針もお読みください。


    ----------- VB2005 における 曜日値について -----------
        曜日の値は [ 日(1), 月(2), 火(3), 水(4), 木(5), 金(6), 土(7) ] です。
        システム定数の [ vbSunday, vbMonday, … vbSaturday ] が利用できます。


----------------------------------------------------------------------------------------

 


'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/
'_/  --- VB2005 移植版 ( Update: 2020/11/28 ) ---
'_/
'_/  CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
'_/  ( AddinBox  http://addinbox.sakura.ne.jp/index.htm )
'_/  (  旧サイト  http://www.h3.dion.ne.jp/~sakatsu/index.htm )
'_/
'_/  この祝日マクロは『kt関数アドイン』で使用しているものを
'_/  VB2005へ移植したものです。
'_/  このロジックは、レスポンスを第一義として、可能な限り少ない
'_/  【条件判定の実行】で結果を出せるように設計してあります。
'_/
'_/  この関数では以下の祝日変更までサポートしています。
'_/    (a) 2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補:2019年には[天皇誕生日]はありません)
'_/    (b) 2019年の徳仁親王の即位日(5/1) および
'_/       祝日に挟まれて「国民の休日」となる 4/30(平成天皇の退位日) & 5/2 の2休日
'_/    (c) 2019年の「即位の礼 正殿の儀 (10/22) 」
'_/    (d) 2020年施行の「体育の日の改名」⇒スポーツの日
'_/    (e) 五輪特措法による2020年の「祝日移動」
'_/       海の日:7/20(3rd Mon)⇒7/23, スポーツの日:10/12(2nd Mon)⇒7/24, 山の日:8/11⇒8/10
'_/    (f) 五輪特措法による2021年の「祝日移動」
'_/       海の日:7/19(3rd Mon)⇒7/22, スポーツの日:10/11(2nd Mon)⇒7/23, 山の日:8/11⇒8/8
'_/
'_/  (*1)このマクロを引用するに当たっては、必ずこのコメントも
'_/      一緒に引用する事とします。
'_/  (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
'_/      【 http://addinbox.sakura.ne.jp/holiday_logic.htm 】
'_/      へのリンクによる紹介で対応して下さい。
'_/  (*3)[ktHolidayName]という関数名そのものは、各自の環境に
'_/      おける命名規則に沿って変更しても構いません。
'_/ 
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


Public Function ktHolidayName(ByVal 日付 As Date) As String
Dim dtm日付 As Date
Dim str祝日名 As String
Const cst振替休日施行日 As Date = #4/12/1973#

'時刻/時刻誤差の削除(Now関数などへの対応)
    dtm日付 = DateSerial(日付.Year, 日付.Month, 日付.Day)

    'シリアル値は[±0.5秒]の誤差範囲で認識されます。2002/6/21はシリアル値で
    '[37428.0]ですが、これに[-0.5秒]の誤差が入れば[37427.9999942130]となり、
    'Int関数で整数部分を取り出せば[37427]で前日日付になってしまいます。
    '※ 但し、引数に指定する値が必ず【手入力した日付】等で、時刻や時刻誤差を
    '  考慮しなくても良いならば、このステップは不要です。引数[日付]をそのまま
    '  使用しても問題ありません(ほとんどの利用形態ではこちらでしょうが‥‥)。


    str祝日名 = prv祝日(dtm日付)

    ' ----- 振替休日の判定 (振替休日施行日:1973/4/12) -----
    ' [ 対象日≠祝日/休日 & 対象日=月曜日 ]のみ、前日(=日曜日)を祝日判定する。
    ' 前日(=日曜日)が祝日の場合は”振替休日”となる。
    ' 尚、5月6日の扱いを
    '     「火曜 or 水曜(みどりの日(5/4) or 憲法記念日(5/3)の振替休日)」⇒5月ブロック内で判定済
    '     「月曜(こどもの日(5/5)の振替休日」⇒ここの判定処理で判定
    ' とする事により、ここでの判定対象は『対象日が月曜日』のみ となります。

    If (str祝日名 = "") Then
        If (Weekday(dtm日付) = vbMonday) Then
            If (dtm日付 >= cst振替休日施行日) Then
                str祝日名 = prv祝日(dtm日付.AddDays(-1))
                If (str祝日名 <> "") Then
                    ktHolidayName = "振替休日"
                Else
                    ktHolidayName = ""
                End If
            Else
                ktHolidayName = ""
            End If
        Else
            ktHolidayName = ""
        End If
    Else
        ktHolidayName = str祝日名
    End If
End Function

'========================================================================
Private Function prv祝日(ByVal 日付 As Date) As String
Dim int年 As Integer
Dim int月 As Integer
Dim int日 As Integer
Dim int秋分日 As Integer
Dim str第N曜日 As String

' 時刻データ(小数部)は取り除いてあるので、下記の日付との比較はOK
Const cst祝日法施行 As Date = #7/20/1948#
Const cst昭和天皇の大喪の礼 As Date = #2/24/1989#
Const cst明仁親王の結婚の儀 As Date = #4/10/1959#
Const cst徳仁親王の結婚の儀 As Date = #6/9/1993#
Const cst即位礼正殿の儀 As Date = #11/12/1990#    '平成天皇

Const cst平成天皇の退位 As Date = #4/30/2019#    '祝日ではなく「国民の休日」です
Const cst徳仁親王の即位 As Date = #5/1/2019#
Const cst2019GW国民の休日 As Date = #5/2/2019#    '祝日ではなく「国民の休日」です
Const cst即位礼正殿の儀_徳仁親王 As Date = #10/22/2019#

    int年 = 日付.Year
    int月 = 日付.Month
    int日 = 日付.Day

    prv祝日 = ""
    If (日付 < cst祝日法施行) Then
        Exit Function    ' 祝日法施行以前
    End If

    Select Case int月
    '-- 1月 --
    Case 1
        If (int日 = 1) Then
            prv祝日 = "元日"
        Else
            If (int年 >= 2000) Then
                str第N曜日 = (((int日 - 1) \ 7) + 1) & Weekday(日付)
                If (str第N曜日 = "22") Then  '2nd Monday(2)
                    prv祝日 = "成人の日"
                End If
            Else
                If (int日 = 15) Then
                    prv祝日 = "成人の日"
                End If
            End If
        End If

    '-- 2月 --
    Case 2
        If (int日 = 11) Then
            If (int年 >= 1967) Then
                prv祝日 = "建国記念の日"
            End If
        ElseIf (int日 = 23) Then
            If (int年 >= 2020) Then
                prv祝日 = "天皇誕生日"
            End If
        ElseIf (日付 = cst昭和天皇の大喪の礼) Then
            prv祝日 = "昭和天皇の大喪の礼"
        End If

    '-- 3月 --
    Case 3
        If (int日 = prv春分日(int年)) Then  ' 1948〜2150以外は[99]
            prv祝日 = "春分の日"            ' が返るので、必ず≠になる
        End If

    '-- 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
            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月 --
    Case 6
        If (日付 = cst徳仁親王の結婚の儀) Then
            prv祝日 = "皇太子徳仁親王の結婚の儀"
        End If

    '-- 7月 --
    Case 7
        str第N曜日 = (((int日 - 1) \ 7) + 1) & Weekday(日付)
        Select Case int年
          Case Is >= 2022
            If (str第N曜日 = "32") Then  '3rd Monday(2)
                prv祝日 = "海の日"
            End If
          Case 2021
            '2021年はオリンピック特措法により
            '「海の日」が 7/22 , 「スポーツの日」が 7/23 に移動
            Select Case int日
              Case 22
                prv祝日 = "海の日"
              Case 23
                prv祝日 = "スポーツの日"
              Case Else
            End Select
          Case 2020
            '2020年はオリンピック特措法により
            '「海の日」が 7/23 , 「スポーツの日」が 7/24 に移動
            Select Case int日
              Case 23
                prv祝日 = "海の日"
              Case 24
                prv祝日 = "スポーツの日"
              Case Else
            End Select
          Case Is >= 2003
            If (str第N曜日 = "32") Then  '3rd Monday(2)
                prv祝日 = "海の日"
            End If
          Case Is >= 1996
            If (int日 = 20) Then
                prv祝日 = "海の日"
            End If
          Case Else
        End Select

    '-- 8月 --
    Case 8
        Select Case int年
          Case Is >= 2022
            If (int日 = 11) Then
                prv祝日 = "山の日"
            End If
          Case 2021
            '2021年はオリンピック特措法により「山の日」が 8/8 に移動
            If (int日 = 8) Then
                prv祝日 = "山の日"
            End If
          Case 2020
            '2020年はオリンピック特措法により「山の日」が 8/10 に移動
            If (int日 = 10) Then
                prv祝日 = "山の日"
            End If
          Case Is >= 2016
            If (int日 = 11) Then
                prv祝日 = "山の日"
            End If
          Case Else
        End Select

    '-- 9月 --
    Case 9
        '第3月曜日(15〜21)と秋分日(22〜24)が重なる事はない
        int秋分日 = prv秋分日(int年)
        If (int日 = int秋分日) Then  ' 1948〜2150以外は[99]
            prv祝日 = "秋分の日"      ' が返るので、必ず≠になる
        Else
            If (int年 >= 2003) Then
                str第N曜日 = (((int日 - 1) \ 7) + 1) & Weekday(日付)
                If (str第N曜日 = "32") Then  '3rd Monday(2)
                    prv祝日 = "敬老の日"
                ElseIf (Weekday(日付) = vbTuesday) Then
                    If (int日 = (int秋分日 - 1)) Then
                        prv祝日 = "国民の休日'火曜日&[秋分日の前日]
                    End If
                End If
            ElseIf (int年 >= 1966) Then
                If (int日 = 15) Then
                    prv祝日 = "敬老の日"
                End If
            End If
        End If

    '-- 10月 --
    Case 10
        str第N曜日 = (((int日 - 1) \ 7) + 1) & Weekday(日付)
        Select Case int年
          Case Is >= 2022
            If (str第N曜日 = "22") Then  '2nd Monday(2)
                prv祝日 = "スポーツの日"   '2020年より改名
            End If
          Case 2020 , 2021
            '2021年はオリンピック特措法により「スポーツの日」が 7/23 に移動
            '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月 --
    Case 11
        If (int日 = 3) Then
            prv祝日 = "文化の日"
        ElseIf (int日 = 23) Then
            prv祝日 = "勤労感謝の日"
        ElseIf (日付 = cst即位礼正殿の儀) Then
            prv祝日 = "即位礼正殿の儀"
        End If

    '-- 12月 --
    Case 12
        If (int日 = 23) Then
            If ((int年 >= 1989) And (int年 <= 2018)) Then
                prv祝日 = "天皇誕生日' 平成天皇
            End If
        End If
    End Select
End Function

'======================================================================
'  春分/秋分日の略算式は
'    『海上保安庁水路部 暦計算研究会編 新こよみ便利帳』
'  で紹介されている式です。

Private Function prv春分日(ByVal 年 As Integer) As Integer
    If (年 <= 1947) Then
        prv春分日 = 99        '祝日法施行前
    ElseIf (年 <= 1979) Then
        '(年 - 1983)がマイナスになるので『Fix関数』にする
        prv春分日 = CInt(Fix(20.8357 + (0.242194 * (年 - 1980)) - Fix((年 - 1983) / 4)))
    ElseIf (年 <= 2099) Then
        prv春分日 = CInt(Fix(20.8431 + (0.242194 * (年 - 1980)) - Fix((年 - 1980) / 4)))
    ElseIf (年 <= 2150) Then
        prv春分日 = CInt(Fix(21.851 + (0.242194 * (年 - 1980)) - Fix((年 - 1980) / 4)))
    Else
        prv春分日 = 99        '2151年以降は略算式が無いので不明
    End If
End Function

'========================================================================
Private Function prv秋分日(ByVal 年 As Integer) As Integer
    If (年 <= 1947) Then
        prv秋分日 = 99        '祝日法施行前
    ElseIf (年 <= 1979) Then
        '(年 - 1983)がマイナスになるので『Fix関数』にする
        prv秋分日 = CInt(Fix(23.2588 + (0.242194 * (年 - 1980)) - Fix((年 - 1983) / 4)))
    ElseIf (年 <= 2099) Then
        prv秋分日 = CInt(Fix(23.2488 + (0.242194 * (年 - 1980)) - Fix((年 - 1980) / 4)))
    ElseIf (年 <= 2150) Then
        prv秋分日 = CInt(Fix(24.2488 + (0.242194 * (年 - 1980)) - Fix((年 - 1980) / 4)))
    Else
        prv秋分日 = 99        '2151年以降は略算式が無いので不明
    End If
End Function

'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/  CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/




[ この場所へのリンク ]


VBS 用祝日判定コード 】    [ 検証用データ ( 祝日一覧 ) は JavaScript 版による ツール で取得できます ]  [ 不具合報告 メール送信 ]
  2003/3/2 追記
  2005/5/20 [昭和の日]改正の修正
  2014/5/29 [山の日]改正の修正
  2018/2/15 [天皇誕生日の変更]改正の修正
  2018/6/21 [体育の日⇒スポーツの日 改名] & [五輪特措法による祝日移動(2020年)] 改正の修正
  2018/12/8 [即位の日 および 4/30 & 5/2の国民の休日] [即位礼正殿の儀] 改正の修正
  2018/12/8 変数名を見直して変更しました(単語先頭を大文字にする etc)
  2020/11/28 [五輪特措法による祝日移動(2021年)] 改正の修正

    VBAコードのロジックを、そのまま[ASP上のVBS ]用に書き直したものです。
    「立野 徹」さんによる編集です。
    VBAとの違いは、
        (1) 変数名等に日本語名が使えない
        (2) 変数の属性は全て[Variant](なので、Dim宣言は無くなってます)
    土日なども一緒に判定するなど条件を付加する場合は、こちらの解説を参考にして下さい。

    『祝日について

    「昭和の日」に伴う「振替休日(5月6日)」改正への修正方針もお読みください。
    「即位の日(2019/5/1)」に伴う「祝日に挟まれた平日(4/30 & 5/2)の休日化」への修正方針もお読みください。


    ----------- VBS における 曜日値について -----------
        曜日の値は [ 日(1), 月(2), 火(3), 水(4), 木(5), 金(6), 土(7) ] です。
        システム定数の [ vbSunday, vbMonday, … vbSaturday ] が利用できます。


----------------------------------------------------------------------------------------

 


<%
'================================================================
'=
'= VBScript用祝日算出関数
'=
'=    VBSでは日本語変数名が利用できませんので、英数字変数名に統一
'=    しています。また、変数定義(dim)を省略しています。それ以外の部
'=    分については、角田氏作成のVBコードを利用しています。
'=
'=    補) 2018/12/8 変数名を見直して変更しました(単語先頭を大文字にする etc)
'= 
'=      コードの取り込み(1)
'=      (複数のプログラムで利用する場合、こちらの方法がお勧め)
'=        本コードをGetHoliday.aspとして保存し、利用するプログラ
'=        ムに、次のステートメントを加えます。
'=          <!-- #Include virtual="./GetHoliday.asp" -->
'=        (ファイル名等は保存場所により適宜変更して下さい)
'=      コードの取り込み(2)
'=        本コードをプログラムに書き加えます。
'=
'=      取り込み時の注意
'=        VBSは<%〜%>の間に記述しなければなりませんので、本
'=        コードの先頭に <% と、末尾に %> があります。場合によって
'=        は削除しても構いません(<%, %>は半角で記述)。
'=
'=      利用方法
'=        ktHolidayName(日付)とし、日付は内部形式Date(日付型)の
'=        Variant型を関数に引き渡して下さい。戻り値は文字列です。
'=          例:ktHolidayName(Now)〜今日の祝日名(文字列)を取得
'=
'================================================================

'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/
'_/  --- VBS 移植版 ( Update: 2020/11/28 ) ---
'_/
'_/  CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
'_/  ( AddinBox  http://addinbox.sakura.ne.jp/index.htm )
'_/  (  旧サイト  http://www.h3.dion.ne.jp/~sakatsu/index.htm )
'_/
'_/  この祝日マクロは『kt関数アドイン』で使用しているものです。
'_/  このロジックは、レスポンスを第一義として、可能な限り少ない
'_/  【条件判定の実行】で結果を出せるように設計してあります。
'_/
'_/  この関数では以下の祝日変更までサポートしています。
'_/    (a) 2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補:2019年には[天皇誕生日]はありません)
'_/    (b) 2019年の徳仁親王の即位日(5/1) および
'_/       祝日に挟まれて「国民の休日」となる 4/30(平成天皇の退位日) & 5/2 の2休日
'_/    (c) 2019年の「即位の礼 正殿の儀 (10/22) 」
'_/    (d) 2020年施行の「体育の日の改名」⇒スポーツの日
'_/    (e) 五輪特措法による2020年の「祝日移動」
'_/       海の日:7/20(3rd Mon)⇒7/23, スポーツの日:10/12(2nd Mon)⇒7/24, 山の日:8/11⇒8/10
'_/    (f) 五輪特措法による2021年の「祝日移動」
'_/       海の日:7/19(3rd Mon)⇒7/22, スポーツの日:10/11(2nd Mon)⇒7/23, 山の日:8/11⇒8/8
'_/
'_/  (*1)このマクロを引用するに当たっては、必ずこのコメントも
'_/      一緒に引用する事とします。
'_/  (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
'_/      【 http://addinbox.sakura.ne.jp/holiday_logic.htm 】
'_/      へのリンクによる紹介で対応して下さい。
'_/  (*3)[ktHolidayName]という関数名そのものは、各自の環境に
'_/      おける命名規則に沿って変更しても構いません。
'_/
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


Public Function ktHolidayName(ChkDate)
  cstImplementHolidayInLieu = CDate("1973/04/12")    '振替休日施行日

  '時刻/時刻誤差の削除(Now関数などへの対応)
  dtmChkDate = DateSerial(Year(ChkDate), Month(ChkDate), Day(ChkDate))

  'シリアル値は[±0.5秒]の誤差範囲で認識されます。2002/6/21はシリアル値で
  '[37428.0]ですが、これに[-0.5秒]の誤差が入れば[37427.9999942130]となり、
  'Int関数で整数部分を取り出せば[37427]で前日hdayになってしまいます。
  '※ 但し、引数に指定する値が必ず【手入力したhday】等で、時刻や時刻誤差を
  '  考慮しなくても良いならば、このステップは不要です。引数[hday]をそのまま
  '  使用しても問題ありません(ほとんどの利用形態ではこちらでしょうが‥‥)。


  strHolidayName = prvHolidayChk(dtmChkDate)

  ' ----- 振替休日の判定 (振替休日施行日:1973/4/12) -----
  ' [ 対象日≠祝日/休日 & 対象日=月曜日 ]のみ、前日(=日曜日)を祝日判定する。
  ' 前日(=日曜日)が祝日の場合は”振替休日”となる。
  ' 尚、5月6日の扱いを
  '     「火曜 or 水曜(みどりの日(5/4) or 憲法記念日(5/3)の振替休日)」⇒5月ブロック内で判定済
  '     「月曜(こどもの日(5/5)の振替休日」⇒ここの判定処理で判定
  ' とする事により、ここでの判定対象は『対象日が月曜日』のみ となります。

  If (strHolidayName = "") Then
    If (Weekday(dtmChkDate) = vbMonday) Then
      If (dtmChkDate >= cstImplementHolidayInLieu) Then
        strHolidayName = prvHolidayChk(dtmChkDate - 1)
        If (strHolidayName <> "") Then
          ktHolidayName = "振替休日"
        Else
          ktHolidayName = ""
        End If
      Else
        ktHolidayName = ""
      End If
    Else
      ktHolidayName = ""
    End If
  Else
    ktHolidayName = strHolidayName
  End If
End Function

'========================================================================
' ( 2018/12/7    関数名を prvhday から prvHolidayChk に変更しました )

Private Function prvHolidayChk(CheckDate)
  ' 時刻データ(小数部)は取り除いてあるので、下記のCheckDateとの比較はOK
  cstImplementTheLawOfHoliday = CDate("1948/07/20") ' 祝日法施行
  cstAkihitoKekkon = CDate("1959/04/10")            ' 明仁親王の結婚の儀
  cstShowaTaiso = CDate("1989/02/24")               ' 昭和天皇の大喪の礼
  cstNaruhitoKekkon = CDate("1993/06/09")           ' 徳仁親王の結婚の儀
  cstSokuireiSeiden = CDate("1990/11/12")           ' 即位礼正殿の儀(平成天皇)

  cstTaii_Heisei = CDate("2019/4/30")               ' 祝日ではなく「国民の休日」です
  cstSokui_Naruhito = CDate("2019/5/1")             ' 即位の日(徳仁親王)
  cst2019GW_May2nd = CDate("2019/5/2")              ' 祝日ではなく「国民の休日」です
  cstSokuireiSeiden_Naruhito = CDate("2019/10/22")  ' 即位礼正殿の儀(徳仁親王)

  intYear = Year(CheckDate)
  intMonth = Month(CheckDate)
  intDay = Day(CheckDate)

  prvHolidayChk = ""
  If (CheckDate < cstImplementTheLawOfHoliday) Then
    Exit Function    ' 祝日法施行以前
  End If

  Select Case intMonth
  '-- 1月 --
  Case 1
    If (intDay = 1) Then
      prvHolidayChk = "元日"
    Else
      If (intYear >= 2000) Then
        strNumberOfWeek = (((intDay - 1) \ 7) + 1) & Weekday(CheckDate)
        If (strNumberOfWeek = "22") Then    '2nd Monday(2)
          prvHolidayChk = "成人の日"
        End If
      Else
        If (intDay = 15) Then
          prvHolidayChk = "成人の日"
        End If
      End If
    End If

  '-- 2月 --
  Case 2
    If (intDay = 11) Then
      If (intYear >= 1967) Then
        prvHolidayChk = "建国記念の日"
      End If
    ElseIf (intDay = 23) Then
      If (intYear >= 2020) Then
        prvHolidayChk = "天皇誕生日"
      End If
    ElseIf (CheckDate = cstShowaTaiso) Then
      prvHolidayChk = "昭和天皇の大喪の礼"    '1989/2/24
    End If

  '-- 3月 --
  Case 3
    If (intDay = prvVernalEquinox(intYear)) Then    ' 1948〜2150以外は[99]
      prvHolidayChk = "春分の日"    ' が返るので、必ず≠になる
    End If

  '-- 4月 --
  Case 4
    If (intDay = 29) Then
      If (intYear >= 2007) Then
        prvHolidayChk = "昭和の日"
      ElseIf (intYear >= 1989) Then
        prvHolidayChk = "みどりの日"
      Else
        prvHolidayChk = "天皇誕生日' 昭和天皇
      End If
    ElseIf (CheckDate = cstTaii_Heisei) Then    ' 2019/4/30(平成天皇の退位日)
      prvHolidayChk = "国民の休日"    '祝日に挟まれた国民の休日です
    ElseIf (CheckDate = cstAkihitoKekkon) Then
      prvHolidayChk = "皇太子明仁親王の結婚の儀"    '1959/4/10
    End If

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

  '-- 6月 --
  Case 6
    If (CheckDate = cstNaruhitoKekkon) Then
      prvHolidayChk = "皇太子徳仁親王の結婚の儀"    '1993/6/9
    End If

  '-- 7月 --
  Case 7
    strNumberOfWeek = (((intDay - 1) \ 7) + 1) & Weekday(CheckDate)
    If (intYear >= 2022) Then
      If (strNumberOfWeek = "32") Then  '3rd Monday(2)
        prvHolidayChk = "海の日"
      End If
    ElseIf (intYear = 2021) Then
      '2021年はオリンピック特措法により
      '「海の日」が 7/22 , 「スポーツの日」が 7/23 に移動
      If (intDay = 22) Then
        prvHolidayChk = "海の日"
      ElseIf (intDay = 23) Then
        prvHolidayChk = "スポーツの日"
      End If
    ElseIf (intYear = 2020) Then
      '2020年はオリンピック特措法により
      '「海の日」が 7/23 , 「スポーツの日」が 7/24 に移動
      If (intDay = 23) Then
        prvHolidayChk = "海の日"
      ElseIf (intDay = 24) Then
        prvHolidayChk = "スポーツの日"
      End If
    ElseIf (intYear >= 2003) Then
      If (strNumberOfWeek = "32") Then  '3rd Monday(2)
        prvHolidayChk = "海の日"
      End If
    ElseIf (intYear >= 1996) Then
      If (intDay = 20) Then
        prvHolidayChk = "海の日"
      End If
    End If

  '-- 8月 --
  Case 8
    If (intYear >= 2022) Then
      If (intDay = 11) Then
        prvHolidayChk = "山の日"
      End If
    ElseIf (intYear = 2021) Then
      '2021年はオリンピック特措法により「山の日」が 8/8 に移動
      If (intDay = 8) Then
        prvHolidayChk = "山の日"
      End If
    ElseIf (intYear = 2020) Then
      '2020年はオリンピック特措法により「山の日」が 8/10 に移動
      If (intDay = 10) Then
        prvHolidayChk = "山の日"
      End If
    ElseIf (intYear >= 2016) Then
      If (intDay = 11) Then
        prvHolidayChk = "山の日"
      End If
    End If

  '-- 9月 --
  Case 9
    '第3月曜日(15〜21)と秋分日(22〜24)が重なる事はない
    intSyuubun = prvAutumnalEquinox(intYear)
    If (intDay = intSyuubun) Then    ' 1948〜2150以外は[99]
      prvHolidayChk = "秋分の日"    ' が返るので、必ず≠になる
    Else
      If (intYear >= 2003) Then
        strNumberOfWeek = (((intDay - 1) \ 7) + 1) & Weekday(CheckDate)
        If (strNumberOfWeek = "32") Then    '3rd Monday(2)
          prvHolidayChk = "敬老の日"
        ElseIf (Weekday(CheckDate) = vbTuesday) Then
          If (intDay = (intSyuubun - 1)) Then
            prvHolidayChk = "国民の休日"    '火曜日&[秋分日の前日]
          End If
        End If
      ElseIf (intYear >= 1966) Then
        If (intDay = 15) Then
          prvHolidayChk = "敬老の日"
        End If
      End If
    End If

  '-- 10月 --
  Case 10
    strNumberOfWeek = (((intDay - 1) \ 7) + 1) & Weekday(CheckDate)
    If (intYear >= 2022) Then
      If (strNumberOfWeek = "22") Then    '2nd Monday(2)
        prvHolidayChk = "スポーツの日"   '2020年より改名
      End If
    ElseIf ((intYear = 2020) Or (intYear = 2021)) Then
      '2021年はオリンピック特措法により「スポーツの日」が 7/23 に移動
      '2020年はオリンピック特措法により「スポーツの日」が 7/24 に移動
    ElseIf (intYear >= 2000) Then
      If (strNumberOfWeek = "22") Then    '2nd Monday(2)
        prvHolidayChk = "体育の日"
      ElseIf (CheckDate = cstSokuireiSeiden_Naruhito) Then
        prvHolidayChk = "即位礼正殿の儀"    ' 徳仁親王(2019/10/22)
      End If
    ElseIf (intYear >= 1966) Then
      If (intDay = 10) Then
        prvHolidayChk = "体育の日"
      End If
    End If

  '-- 11月 --
  Case 11
    If (intDay = 3) Then
      prvHolidayChk = "文化の日"
    ElseIf (intDay = 23) Then
      prvHolidayChk = "勤労感謝の日"
    ElseIf (CheckDate = cstSokuireiSeiden) Then
      prvHolidayChk = "即位礼正殿の儀' 1990/11/12(平成天皇)
    End If

  '-- 12月 --
  Case 12
    If (intDay = 23) Then
      If ((intYear >= 1989) And (intYear <= 2018)) Then
        prvHolidayChk = "天皇誕生日' 平成天皇
      End If
    End If
  End Select
End Function

'======================================================================
'  春分/秋分日の略算式は
'    『海上保安庁水路部 暦計算研究会編 新こよみ便利帳』
'  で紹介されている式です。
'
' ( 2018/12/8    関数名を prvsyunbun から prvVernalEquinox に変更しました )

Private Function prvVernalEquinox(ChkYear)
  If (ChkYear <= 1947) Then
    prvVernalEquinox = 99    '祝日法施行前
  ElseIf (ChkYear <= 1979) Then
    '(tosi - 1983)がマイナスになるので『Fix関数』にする
    prvVernalEquinox = Fix(20.8357 + _
                      (0.242194 * (ChkYear - 1980)) - Fix((ChkYear - 1983) / 4))
  ElseIf (ChkYear <= 2099) Then
    prvVernalEquinox = Fix(20.8431 + _
                      (0.242194 * (ChkYear - 1980)) - Fix((ChkYear - 1980) / 4))
  ElseIf (ChkYear <= 2150) Then
    prvVernalEquinox = Fix(21.851 + _
                      (0.242194 * (ChkYear - 1980)) - Fix((ChkYear - 1980) / 4))
  Else
    prvVernalEquinox = 99    '2151年以降は略算式が無いので不明
  End If
End Function

'========================================================================
' ( 2018/12/8    関数名を prvsyubun から prvAutumnalEquinox に変更しました )
Private Function prvAutumnalEquinox(ChkYear)
  If (ChkYear <= 1947) Then
    prvAutumnalEquinox = 99    '祝日法施行前
  ElseIf (ChkYear <= 1979) Then
    '(tosi - 1983)がマイナスになるので『Fix関数』にする
    prvAutumnalEquinox = Fix(23.2588 + _
                    (0.242194 * (ChkYear - 1980)) - Fix((ChkYear - 1983) / 4))
  ElseIf (ChkYear <= 2099) Then
    prvAutumnalEquinox = Fix(23.2488 + _
                    (0.242194 * (ChkYear - 1980)) - Fix((ChkYear - 1980) / 4))
  ElseIf (ChkYear <= 2150) Then
    prvAutumnalEquinox = Fix(24.2488 + _
                    (0.242194 * (ChkYear - 1980)) - Fix((ChkYear - 1980) / 4))
  Else
    prvAutumnalEquinox = 99    '2151年以降は略算式が無いので不明
  End If
End Function

'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/  CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

%>



HTML内に埋め込んで使う場合には、[ <% 〜 %> ]の範囲(<% , %> は除く)を下記の場所に
コピーします。下記の例ではTextBox1に日付を入れてButton1をクリックすると祝日名が
TextBox2に表示されます。

<HTML>
<HEAD>
<TITLE></TITLE>
<SCRIPT language="VBScript">
<!--
    【この場所にVBSコードを貼り付けます】
'========================================================================
Sub Button1_onClick()
Dim TheForm
Set TheForm = Document.Form1
    TheForm.TextBox2.Value = ktHolidayName(TheForm.TextBox1.Value)
End Sub
'-->
</SCRIPT>
</HEAD>
<BODY>
<FORM name="Form1">
<INPUT size="20" type="text" name="TextBox1">
<INPUT TYPE="Button" NAME="Button1">
<INPUT size="20" type="text" name="TextBox2">
</FORM>
</BODY>
</HTML>




[ この場所へのリンク ]


PHP 用祝日判定コード 】    [ 検証用データ ( 祝日一覧 ) は JavaScript 版による ツール で取得できます ]  [ 不具合報告 メール送信 ]
  2003/5/6 追記
  2005/5/20 [昭和の日]改正の修正
  2007/4/11 [11月]の部分で、変数の$抜けを修正
  2007/5/26 [ 5月]の部分で、if 条件のカッコ不足を修正
  2014/5/29 [山の日]改正の修正
  2018/2/15 [天皇誕生日の変更]改正の修正
  2018/6/21 [体育の日⇒スポーツの日 改名] & [五輪特措法による祝日移動(2020年)] 改正の修正
  2018/12/8 [即位の日 および 4/30 & 5/2の国民の休日] [即位礼正殿の儀] 改正の修正
  2019/4/22 日付データ引数から時刻除去する修正
  2020/11/28 [五輪特措法による祝日移動(2021年)] 改正の修正

      VBAコードのロジックを、そのまま[PHP ]用に書き直したものです。
    代理店どっとこむ「中野」さんによる編集です。
    土日なども一緒に判定するなど条件を付加する場合は、こちらの解説を参考にして下さい。

    『祝日について

    「昭和の日」に伴う「振替休日(5月6日)」改正への修正方針もお読みください。
    「即位の日(2019/5/1)」に伴う「祝日に挟まれた平日(4/30 & 5/2)の休日化」への修正方針もお読みください。


    --- 修正内容の説明 --------------------------------------
      2019/4/22  prvHolidayChk に下記ステップを追加
        $MyYear = Year($MyDate);
        $MyMonth = Month($MyDate);
        $MyDay = Day($MyDate);
        $MyDate = mktime(0,0,0,$MyMonth,$MyDay,$MyYear);    ← 追加


    ----------- PHP における 曜日値について -----------
        曜日の値は [ 日(0), 月(1), 火(2), 水(3), 木(4), 金(5), 土(6) ] です。
        システム定数は用意されていません。
        尚、このプログラムでは Weekday 関数を別途用意して [ 日(1), 月(2), 火(3), 水(4), 木(5), 金(6), 土(7) ] で扱っています。


----------------------------------------------------------------------------------------

 


<?
// PHP版
// オリジナルはyy/mm/dd文字列ですが、シリアルで入れてください

// sample code

    $aa = mktime(0,0,0,11,4,2002);
    echo ktHolidayName($aa);
// --- end

//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/
//_/  --- PHP 移植版 ( Update: 2020/11/28 ) ---
//_/
//_/  CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
//_/  ( AddinBox  http://addinbox.sakura.ne.jp/index.htm )
//_/  (  旧サイト  http://www.h3.dion.ne.jp/~sakatsu/index.htm )
//_/
//_/  この祝日判定コードは『Excel:kt関数アドイン』で使用している
//_/  VBAマクロを[PHP]に移植したものです。
//_/
//_/  この関数では以下の祝日変更までサポートしています。
//_/    (a) 2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補:2019年には[天皇誕生日]はありません)
//_/    (b) 2019年の徳仁親王の即位日(5/1) および
//_/       祝日に挟まれて「国民の休日」となる 4/30(平成天皇の退位日) & 5/2 の2休日
//_/    (c) 2019年の「即位の礼 正殿の儀 (10/22) 」
//_/    (d) 2020年施行の「体育の日の改名」⇒スポーツの日
//_/    (e) 五輪特措法による2020年の「祝日移動」
//_/       海の日:7/20(3rd Mon)⇒7/23, スポーツの日:10/12(2nd Mon)⇒7/24, 山の日:8/11⇒8/10
//_/    (f) 五輪特措法による2021年の「祝日移動」
//_/       海の日:7/19(3rd Mon)⇒7/22, スポーツの日:10/11(2nd Mon)⇒7/23, 山の日:8/11⇒8/8
//_/
//_/  (*1)このコードを引用するに当たっては、必ずこのコメントも
//_/      一緒に引用する事とします。
//_/  (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
//_/      【 http://addinbox.sakura.ne.jp/holiday_logic.htm 】
//_/      へのリンクによる紹介で対応して下さい。
//_/  (*3)[ktHolidayName]という関数名そのものは、各自の環境に
//_/      おける命名規則に沿って変更しても構いません。
//_/ 
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


function ktHolidayName($MyDate)
{
  define("MONDAY","2");   // 後述 Weekday関数 [日(1),月(2)‥‥土(7)]

  $cstImplementHolidayInLieu = mktime(0,0,0,4,12,1973);   // 振替休日施行

  $HolidayName = prvHolidayChk($MyDate);

  // ----- 振替休日の判定 (振替休日施行日:1973/4/12) -----
  // [ 対象日≠祝日/休日 & 対象日=月曜日 ]のみ、前日(=日曜日)を祝日判定する。
  // 前日(=日曜日)が祝日の場合は”振替休日”となる。
  // 尚、5月6日の扱いを
  //     「火曜 or 水曜(みどりの日(5/4) or 憲法記念日(5/3)の振替休日)」⇒5月ブロック内で判定済
  //     「月曜(こどもの日(5/5)の振替休日」⇒ここの判定処理で判定
  // とする事により、ここでの判定対象は『対象日が月曜日』のみ となります。

  if ($HolidayName == "") {
      if (Weekday($MyDate) == MONDAY) {
          if ($MyDate >= $cstImplementHolidayInLieu) {
              $YesterDay = mktime(0,0,0,Month($MyDate),
                                      (Day($MyDate) - 1),Year($MyDate));
              $HolidayName = prvHolidayChk($YesterDay);
              if ($HolidayName != "") {
                  $Result = "振替休日";
              } else {
                  $Result = "";
              }
          } else {
              $Result = "";
          }
      } else {
          $Result = "";
      }
  } else {
      $Result = $HolidayName;
  }

  return $Result;
}

//========================================================================

function prvHolidayChk($MyDate)
{
  define("MONDAY","2");   // 後述 Weekday関数 [日(1),月(2)‥‥土(7)]
  define("TUESDAY","3");
  define("WEDNESDAY","4");

  $cstImplementTheLawOfHoliday = mktime(0,0,0,7,20,1948);  // 祝日法施行
  $cstShowaTaiso = mktime(0,0,0,2,24,1989);                // 昭和天皇大喪の礼
  $cstAkihitoKekkon = mktime(0,0,0,4,10,1959);             // 明仁親王の結婚の儀
  $cstNaruhitoKekkon = mktime(0,0,0,6,9,1993);             // 徳仁親王の結婚の儀
  $cstSokuireiSeiden = mktime(0,0,0,11,12,1990);           // 即位礼正殿の儀

  $cstTaii_Heisei = mktime(0,0,0,4,30,2019);               // 平成天皇の退位日, 祝日ではなく「国民の休日」です
  $cstSokui_Naruhito = mktime(0,0,0,5,1,2019);             // 即位の日(徳仁親王)
  $cst2019GW_May2nd = mktime(0,0,0,5,2,2019);              // 祝日ではなく「国民の休日」です
  $cstSokuireiSeiden_Naruhito = mktime(0,0,0,10,22,2019);  // 即位礼正殿の儀(徳仁親王)

  $MyYear = Year($MyDate);
  $MyMonth = Month($MyDate);
  $MyDay = Day($MyDate);
  $MyDate = mktime(0,0,0,$MyMonth,$MyDay,$MyYear);

  if ($MyDate < $cstImplementTheLawOfHoliday)
      return "";    // 祝日法施行以前
  else;

  $Result = "";
  switch ($MyMonth) {
  // 1月 //
  case 1:
      if ($MyDay == 1) {
          $Result = "元日";
      } else {
          if ($MyYear >= 2000) {
              $strNumberOfWeek =
                        (floor(($MyDay - 1) / 7) + 1) . Weekday($MyDate);
              if ($strNumberOfWeek == "22") {    // 2nd Monday(2)
                  $Result = "成人の日";
              } else;
          } else {
              if ($MyDay == 15) {
                  $Result = "成人の日";
              } else;
          }
      }
      break;

  // 2月 //
  case 2:
      if ($MyDay == 11) {
          if ($MyYear >= 1967) {
              $Result = "建国記念の日";
          } else;
      } elseif ($MyDay == 23) {
          if ($MyYear >= 2020) {
              $Result = "天皇誕生日";
          } else;
      } elseif ($MyDate == $cstShowaTaiso) {
          $Result = "昭和天皇の大喪の礼";
      } else;
      break;

  // 3月 //
  case 3:
      if ($MyDay == prvDayOfSpringEquinox($MyYear)) {    // 1948〜2150以外は[99]
          $Result = "春分の日";                        // が返るので、必ず≠になる
      } else;
      break;

  // 4月 //
  case 4:
      if ($MyDay == 29) {
          if ($MyYear >= 2007) {
              $Result = "昭和の日";
          } elseif ($MyYear >= 1989) {
              $Result = "みどりの日";
          } else {
              $Result = "天皇誕生日";  // 昭和天皇
          }
      } elseif ($MyDate == $cstTaii_Heisei) {    // 2019/4/30(平成天皇の退位日)
          $Result = "国民の休日";    // 祝日に挟まれた国民の休日です
      } elseif ($MyDate == $cstAkihitoKekkon) {    // 1959/4/10
          $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;
      } elseif ($MyDay == 5) {
          $Result = "こどもの日";
      } elseif ($MyDay == 6) {
          if ($MyYear >= 2007) {
              if ((Weekday($MyDate) == TUESDAY) || (Weekday($MyDate) == WEDNESDAY)) {
                  $Result = "振替休日";    // [5/3,5/4が日曜]ケースのみ、ここで判定
              } else;
          } else;
      } else {
          if ($MyYear == 2019) {
              if ($MyDate == $cstSokui_Naruhito) {    // 2019/5/1
                  $Result = "即位の日";    // 徳仁親王
              } elseif ($MyDate == $cst2019GW_May2nd) {    // 2019/5/2
                  $Result = "国民の休日";    //祝日に挟まれた国民の休日です
              } else;
          } else;
      }
      break;

  // 6月 //
  case 6:
      if ($MyDate == $cstNaruhitoKekkon) {
          $Result = "皇太子徳仁親王の結婚の儀";
      } else;
      break;

  // 7月 //
  case 7:
      $strNumberOfWeek = (floor(($MyDay - 1) / 7) + 1) . Weekday($MyDate);
      if ($MyYear >= 2022) {
          if ($strNumberOfWeek == "32") {    // 3rd Monday(2)
              $Result = "海の日";
          } else;
      } elseif ($MyYear == 2021) {
          // 2021年はオリンピック特措法により
          //「海の日」が 7/22 , 「スポーツの日」が 7/23 に移動
          if ($MyDay == 22) {
              $Result = "海の日";
          } elseif ($MyDay == 23) {
              $Result = "スポーツの日";
          } else;
      } elseif ($MyYear == 2020) {
          // 2020年はオリンピック特措法により
          //「海の日」が 7/23 , 「スポーツの日」が 7/24 に移動
          if ($MyDay == 23) {
              $Result = "海の日";
          } elseif ($MyDay == 24) {
              $Result = "スポーツの日";
          } else;
      } elseif ($MyYear >= 2003) {
          if ($strNumberOfWeek == "32") {    // 3rd Monday(2)
              $Result = "海の日";
          } else;
      } elseif ($MyYear >= 1996) {
          if ($MyDay == 20) {
              $Result = "海の日";
          } else;
      } else;
      break;

  // 8月 //
  case 8:
      if ($MyYear >= 2022) {
          if ($MyDay == 11) {
              $Result = "山の日";
          } else;
      } elseif ($MyYear == 2021) {
          // 2021年はオリンピック特措法により「山の日」が 8/8 に移動
          if ($MyDay == 8) {
              $Result = "山の日";
          } else;
      } elseif ($MyYear == 2020) {
          // 2020年はオリンピック特措法により「山の日」が 8/10 に移動
          if ($MyDay == 10) {
              $Result = "山の日";
          } else;
      } elseif ($MyYear >= 2016) {
          if ($MyDay == 11) {
              $Result = "山の日";
          } else;
      } else;
      break;

  // 9月 //
  case 9:
      //第3月曜日(15〜21)と秋分日(22〜24)が重なる事はない
      $MyAutumnEquinox = prvDayOfAutumnEquinox($MyYear);
      if ($MyDay == $MyAutumnEquinox) {    // 1948〜2150以外は[99]
          $Result = "秋分の日";            // が返るので、必ず≠になる
      } else {
          if ($MyYear >= 2003) {
              $strNumberOfWeek =
                      (floor(($MyDay - 1) / 7) + 1) . Weekday($MyDate);
              if ($strNumberOfWeek == "32") {    // 3rd Monday(2)
                  $Result = "敬老の日";
              } elseif (Weekday($MyDate) == TUESDAY) {
                  if ($MyDay == ($MyAutumnEquinox - 1)) {
                      $Result = "国民の休日";    // 火曜日&[秋分日の前日]
                  } else;
              } else;
          } elseif ($MyYear >= 1966) {
              if ($MyDay == 15) {
                  $Result = "敬老の日";
              } else;
          } else;
      }
      break;

  // 10月 //
  case 10:
      $strNumberOfWeek = (floor(( $MyDay - 1) / 7) + 1) . Weekday($MyDate);
      if ($MyYear >= 2022) {
          if ($strNumberOfWeek == "22") {    // 2nd Monday(2)
              $Result = "スポーツの日";      // 2020年より改名
          } else;
      } elseif (($MyYear == 2020) || ($MyYear == 2021)) {
          // 2021年はオリンピック特措法により「スポーツの日」が 7/23 に移動
          // 2020年はオリンピック特措法により「スポーツの日」が 7/24 に移動
      } elseif ($MyYear >= 2000) {
          if ($strNumberOfWeek == "22") {    // 2nd Monday(2)
              $Result = "体育の日";
          } elseif ($MyDate == $cstSokuireiSeiden_Naruhito) {    // 2019/10/22
              $Result = "即位礼正殿の儀";    // 徳仁親王
          } else;
      } elseif ($MyYear >= 1966) {
          if ($MyDay == 10) {
              $Result = "体育の日";
          } else;
      } else;
      break;

  // 11月 //
  case 11:
      if ($MyDay == 3) {
          $Result = "文化の日";
      } elseif ($MyDay == 23) {
          $Result = "勤労感謝の日";
      } elseif ($MyDate == $cstSokuireiSeiden) {
          $Result = "即位礼正殿の儀";  // 平成天皇
      } else;
      break;

  // 12月 //
  case 12:
      if ($MyDay == 23) {
          if (($MyYear >= 1989) && ($MyYear <= 2018)) {
              $Result = "天皇誕生日";  // 平成天皇
          } else;
      } else;
      break;
  }
  return $Result;
}

//======================================================================
//  春分/秋分日の略算式は
//    『海上保安庁水路部 暦計算研究会編 新こよみ便利帳』
//  で紹介されている式です。

function prvDayOfSpringEquinox($MyYear)
{
  if ($MyYear <= 1947)
      $Result = 99; //祝日法施行前
  elseif ($MyYear <= 1979)
      // floor 関数は[VBAのInt関数]に相当
      $Result = floor(20.8357 +
            (0.242194 * ($MyYear - 1980)) - floor(($MyYear - 1980) / 4));
  elseif ($MyYear <= 2099)
      $Result = floor(20.8431 +
            (0.242194 * ($MyYear - 1980)) - floor(($MyYear - 1980) / 4));
  elseif ($MyYear <= 2150)
      $Result = floor(21.851 +
            (0.242194 * ($MyYear - 1980)) - floor(($MyYear - 1980) / 4));
  else
      $Result = 99; //2151年以降は略算式が無いので不明

  return $Result;
}

//========================================================================
function prvDayOfAutumnEquinox($MyYear)
{
  if ($MyYear <= 1947)
      $Result = 99; //祝日法施行前
  elseif ($MyYear <= 1979)
      // floor 関数は[VBAのInt関数]に相当
      $Result = floor(23.2588 +
            (0.242194 * ($MyYear - 1980)) - floor(($MyYear - 1980) / 4));
  elseif ($MyYear <= 2099)
      $Result = floor(23.2488 +
            (0.242194 * ($MyYear - 1980)) - floor(($MyYear - 1980) / 4));
  elseif ($MyYear <= 2150)
      $Result = floor(24.2488 +
            (0.242194 * ($MyYear - 1980)) - floor(($MyYear - 1980) / 4));
  else
      $Result = 99; //2151年以降は略算式が無いので不明

  return $Result;
}

//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/  CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


//---- ktHolidayName用  日付情報サポート関数 ----
function Weekday($MyDate){
  return strftime("%w",$MyDate) + 1;  // 日(0)〜土(6) に1加算して[日(1),月(2)‥‥土(7)]で返す
}

function Year($MyDate){
  return strftime("%Y",$MyDate) - 0;  // 数値で返す(4桁 西暦年 [cf. 2018] )
}

function Month($MyDate){
  return strftime("%m",$MyDate) - 0;  // 数値で返す(1〜12)
}

function Day($MyDate){
  return strftime("%d",$MyDate) - 0;  // 数値で返す(1〜31)
}

//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/  Visual Basic Compatibility functions for PHP
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


?>

    [春分日/秋分日]算出式の『1979年以前』のコードが、VBAやC言語のコードと異なる
        理由はこちらの解説をご覧下さい。PHPの[ floor 関数]では【 floor( -8.4 ) → -9 】です。





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