AddinBox(Title_Logo)

  -- Page 2 --

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

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

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

    ・ [ 生前退位/皇位継承 ]
      平成31年 ( 2019年 ) 4月30日 退位 / 翌5月1日 即位 で決定しました。
      天皇誕生日が [ 12/23 ⇒ 2/3 ] へ変わります(2019年に 天皇誕生日はありません)。
      また、[ 即位礼 正殿の儀 ] は10月22日です。
      (2018/2/15)

 
  ※ 訂正案内 2018/6/21 ※
    下記の言語で 「振替休日の判定」等に誤り がありましたので修正しました。

            [ C , C# , Perl , AWK , Transact-SQL , Python , Go ]

    修正箇所の説明は各言語版の項に記してあります。



※VBA以外に移植したコードも紹介しています※
 ・ 「東京五輪 臨時祝日/体育の日 改名」 改正への対応済みです。 (2018/6/21)
 ・ 「天皇誕生日の変更」 改正への対応済みです。 (2018/2/15)

   [ 旧サイト ( DIONサーバー ) の Internet Archive ( Page 2 ) ]
--言語-- -- 移  植 -- -公開日- -頁-
  ・ 祝日判定マクロ の 設計方針について
  ・ And / Or 演算子 : 完全評価( Complete )型 と 短絡評価( Short-circuit )型
  ・ オーソドックス な 「表引き」 手法との比較
  ・ 祝日判定の拡張 ( 土日も含める 等 ) について
  ・ 拡張マクロ : 銀行休日の判定
  ・ 5月6日 ( 振替休日 ) の判定方法について
 
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
       
      自由に各自のプログラムに組み込んで利用して下さい。なお、フリー/シェアソフト
    開発での利用も可(フリー/シェアでの利用の場合、事後で結構ですので一言
    お知らせください)です。ただし、引用に当たっては、マクロの先頭に記述してある
        コメント(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 [体育の日⇒スポーツの日 改名] & [五輪特措法による祝日移動] 改正の修正

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

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

    『祝日について

    「昭和の日」に伴う「振替休日(5月6日)」改正への修正方針もお読みください。


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


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


'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/
'_/  --- VB2005 移植版 ---
'_/
'_/  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へ移植したものです。
'_/  このロジックは、レスポンスを第一義として、可能な限り少ない
'_/  【条件判定の実行】で結果を出せるように設計してあります。
'_/
'_/  この関数では以下の祝日変更までサポートしています。
'_/  ・2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補:2019年には[天皇誕生日]はありません)
'_/  ・2020年施行の「体育の日の改名」⇒スポーツの日
'_/  ・五輪特措法による2020年の「祝日移動」
'_/      海の日:7/20(3rd Mon)⇒7/23, スポーツの日:10/12(2nd Mon)⇒7/24, 山の日:8/11⇒8/10
'_/
'_/  下記2つについては未だ法整備自体が行なわれていませんので未対応です。
'_/  ・2019年の退位日(4/30)/即位日(5/1)
'_/  ・2019年の「即位の礼 正殿の儀 (10/22) 」
'_/
'_/  (*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#

    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
            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
        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 >= 2021
            If (str第N曜日 = "32") Then  '3rd Monday(2)
                prv祝日 = "海の日"
            End If
          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 >= 2021
            If (int日 = 11) 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 >= 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祝日 = "体育の日"
            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 [体育の日⇒スポーツの日 改名] & [五輪特措法による祝日移動] 改正の修正

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

    『祝日について

    「昭和の日」に伴う「振替休日(5月6日)」改正への修正方針もお読みください。


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


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


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

'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/
'_/  --- VBS 移植版 ---
'_/
'_/  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関数アドイン』で使用しているものです。
'_/  このロジックは、レスポンスを第一義として、可能な限り少ない
'_/  【条件判定の実行】で結果を出せるように設計してあります。
'_/
'_/  この関数では以下の祝日変更までサポートしています。
'_/  ・2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補:2019年には[天皇誕生日]はありません)
'_/  ・2020年施行の「体育の日の改名」⇒スポーツの日
'_/  ・五輪特措法による2020年の「祝日移動」
'_/      海の日:7/20(3rd Mon)⇒7/23, スポーツの日:10/12(2nd Mon)⇒7/24, 山の日:8/11⇒8/10
'_/
'_/  下記2つについては未だ法整備自体が行なわれていませんので未対応です。
'_/  ・2019年の退位日(4/30)/即位日(5/1)
'_/  ・2019年の「即位の礼 正殿の儀 (10/22) 」
'_/
'_/  (*1)このマクロを引用するに当たっては、必ずこのコメントも
'_/      一緒に引用する事とします。
'_/  (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
'_/      【 http://addinbox.sakura.ne.jp/holiday_logic.htm 】
'_/      へのリンクによる紹介で対応して下さい。
'_/  (*3)[ktHolidayName]という関数名そのものは、各自の環境に
'_/      おける命名規則に沿って変更しても構いません。
'_/
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


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

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

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


  strhdayn = prvhday(dtmhday)

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

  If (strhdayn = "") Then
    If (Weekday(dtmhday) = vbMonday) Then
      If (dtmhday >= cstsiko) Then
        strhdayn = prvhday(dtmhday - 1)
        If (strhdayn <> "") Then
          ktHolidayName = "振替休日"
        Else
          ktHolidayName = ""
        End If
      Else
        ktHolidayName = ""
      End If
    Else
      ktHolidayName = ""
    End If
  Else
    ktHolidayName = strhdayn
  End If
End Function

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

  intnen = Year(hday)
  inttuki = Month(hday)
  inthi = Day(hday)

  prvhday = ""
  If (hday < csthosiko) Then
    Exit Function    ' 祝日法施行以前
  End If

  Select Case inttuki
  '-- 1月 --
  Case 1
    If (inthi = 1) Then
      prvhday = "元日"
    Else
      If (intnen >= 2000) Then
        strnyobi = (((inthi - 1) \ 7) + 1) & Weekday(hday)
        If (strnyobi = "22") Then    '2nd Monday(2)
          prvhday = "成人の日"
        End If
      Else
        If (inthi = 15) Then
          prvhday = "成人の日"
        End If
      End If
    End If

  '-- 2月 --
  Case 2
    If (inthi = 11) Then
      If (intnen >= 1967) Then
        prvhday = "建国記念の日"
      End If
    ElseIf (inthi = 23) Then
      If (intnen >= 2020) Then
        prvhday = "天皇誕生日"
      End If
    ElseIf (hday = csttaiso) Then
      prvhday = "昭和天皇の大喪の礼"
    End If

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

  '-- 4月 --
  Case 4
    If (inthi = 29) Then
      If (intnen >= 2007) Then
        prvhday = "昭和の日"
      ElseIf (intnen >= 1989) Then
        prvhday = "みどりの日"
      Else
        prvhday = "天皇誕生日' 昭和天皇
      End If
    ElseIf (hday = cstakihito) Then
      prvhday = "皇太子明仁親王の結婚の儀"
    End If

  '-- 5月 --
  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
      End If
    ElseIf (inthi = 5) Then
      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

  '-- 6月 --
  Case 6
    If (hday = cstnorihito) Then
      prvhday = "皇太子徳仁親王の結婚の儀"
    End If

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

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

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

  '-- 10月 --
  Case 10
    strnyobi = (((inthi - 1) \ 7) + 1) & Weekday(hday)
    If (intnen >= 2021) Then
      If (strnyobi = "22") Then    '2nd Monday(2)
        prvhday = "スポーツの日"   '2020年より改名
      End If
    ElseIf (intnen = 2020) Then
      '2020年はオリンピック特措法により「スポーツの日」が 7/24 に移動
    ElseIf (intnen >= 2000) Then
      If (strnyobi = "22") Then    '2nd Monday(2)
        prvhday = "体育の日"
      End If
    ElseIf (intnen >= 1966) Then
      If (inthi = 10) Then
        prvhday = "体育の日"
      End If
    End If

  '-- 11月 --
  Case 11
    If (inthi = 3) Then
      prvhday = "文化の日"
    ElseIf (inthi = 23) Then
      prvhday = "勤労感謝の日"
    ElseIf (hday = cstsokui) Then
      prvhday = "即位礼正殿の儀' 平成天皇
    End If

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

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

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

'========================================================================
Private Function prvsyubun(tosi)
  If (tosi <= 1947) Then
    prvsyubun = 99    '祝日法施行前
  ElseIf (tosi <= 1979) Then
    '(tosi - 1983)がマイナスになるので『Fix関数』にする
    prvsyubun = Fix(23.2588 + _
                    (0.242194 * (tosi - 1980)) - Fix((tosi - 1983) / 4))
  ElseIf (tosi <= 2099) Then
    prvsyubun = Fix(23.2488 + _
                    (0.242194 * (tosi - 1980)) - Fix((tosi - 1980) / 4))
  ElseIf (tosi <= 2150) Then
    prvsyubun = Fix(24.2488 + _
                    (0.242194 * (tosi - 1980)) - Fix((tosi - 1980) / 4))
  Else
    prvsyubun = 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 [体育の日⇒スポーツの日 改名] & [五輪特措法による祝日移動] 改正の修正

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

    『祝日について

    「昭和の日」に伴う「振替休日(5月6日)」改正への修正方針もお読みください。


    ----------- 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 移植版 ---
//_/
//_/  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]に移植したものです。
//_/
//_/  この関数では以下の祝日変更までサポートしています。
//_/  ・2019年施行の「天皇誕生日の変更」 12/23⇒2/23 (補:2019年には[天皇誕生日]はありません)
//_/  ・2020年施行の「体育の日の改名」⇒スポーツの日
//_/  ・五輪特措法による2020年の「祝日移動」
//_/      海の日:7/20(3rd Mon)⇒7/23, スポーツの日:10/12(2nd Mon)⇒7/24, 山の日:8/11⇒8/10
//_/
//_/  下記2つについては未だ法整備自体が行なわれていませんので未対応です。
//_/  ・2019年の退位日(4/30)/即位日(5/1)
//_/  ・2019年の「即位の礼 正殿の儀 (10/22) 」
//_/
//_/  (*1)このコードを引用するに当たっては、必ずこのコメントも
//_/      一緒に引用する事とします。
//_/  (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
//_/      【 http://addinbox.sakura.ne.jp/holiday_logic.htm 】
//_/      へのリンクによる紹介で対応して下さい。
//_/  (*3)[ktHolidayName]という関数名そのものは、各自の環境に
//_/      おける命名規則に沿って変更しても構いません。
//_/ 
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


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

  $cstImplementHoliday = 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 >= $cstImplementHoliday) {
              $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);            // 明仁親王の結婚の儀
  $cstNorihitoKekkon = mktime(0,0,0,6,9,1993);            // 徳仁親王の結婚の儀
  $cstSokuireiseiden = mktime(0,0,0,11,12,1990);          // 即位礼正殿の儀

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

  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 == $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;
      } 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;
      break;

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

  // 7月 //
  case 7:
      $strNumberOfWeek = (floor(($MyDay - 1) / 7) + 1) . Weekday($MyDate);
      if ($MyYear >= 2021) {
          if ($strNumberOfWeek == "32") {    // 3rd Monday(2)
              $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 >= 2021) {
          if ($MyDay == 11) {
              $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 >= 2021) {
          if ($strNumberOfWeek == "22") {    // 2nd Monday(2)
              $Result = "スポーツの日";      // 2020年より改名
          } else;
      } elseif ($MyYear == 2020) {
          // 2020年はオリンピック特措法により「スポーツの日」が 7/24 に移動
      } elseif ($MyYear >= 2000) {
          if ($strNumberOfWeek == "22") {    // 2nd Monday(2)
              $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.
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/


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.