【 2016年9月15日  サイト 移転のお知らせ 】
      AddinBox サイトを [ DION ] から [ さくら インターネット ] へ移転しました。  なお、旧サイト は 2017年10月 まで残します。
      この ページ の 移転先 URL  ⇒⇒  http://addinbox.sakura.ne.jp/holiday_logic2.htm  
 

AddinBox(Title_Logo)

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

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

      VBA用コードは純粋にVB構文だけ(エクセル独自の機能は使ってません)で作って
    ありますので、エクセルだけでなくアクセスや、その他のVBAを使うアプリケーション
    でも利用できます。
  ※ 重要 ※
    ・ [ 生前退位/皇位継承 ] が 現実味を帯びてきました。 (H28/10/16)
      来年(平成29年)11月〜再来年(平成30年)3月の可能性が大です。
      -- 新サイトに掲載 --

    ・ [ 山の日:8月11日 ] の祝日法改正案が成立しました。 (H26/5/23)
       2016年(平成28年) から施行です。

 
  ※ 訂正案内 2016/3/5 ※
    応用例の Bank_Networkdays 関数に誤りがありました。
    If 文の True/False を取り違えていたため、営業日数 ではなく
    [休業]日数 を算出する ロジック となっていました。




※VBA以外に移植したコードも紹介しています※
 ・ 下記の全ての コード は 「山の日」 祝日改正への対応済みです。(2014/5/29)
 ・ 「昭和の日」 に伴う 「振替休日(5/6)」 改正への 修正方針 もお読みください。 ( 2005/5/20 )
 
--言語-- -- 移 植 -- -公開日- -頁-
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 用祝日判定コード 】  2006/7/4 追記( [昭和の日]改正 対応済 ) , 2014/5/29 [山の日]改正 の修正
    VBAコードのロジックを、そのまま[VB2005 ]用に書き直したものです。
    「Fukuchi」さんによる編集です。
    VBAとの違いは、以下の通りです。
        (1) 日付定数の定義を日付文字列ではなく日付リテラルにより行なう
        (2) 日付から年/月/日を取り出すには、日付オブジェクトに対するYearプロパティ等で行なう
       (3) 日付の加減算は、日付オブジェクトに対するAddDaysメソッドで行なう
       (4) Fix関数の結果をInteger型に代入するには、CInt関数による型変換が必要

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

    『祝日について

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


'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/
'_/ CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
'_/ ( http://www.h3.dion.ne.jp/~sakatsu/index.htm )
'_/
'_/  この祝日マクロは『kt関数アドイン』で使用しているものを
'_/    VB2005へ移植したものです。
'_/  このロジックは、レスポンスを第一義として、可能な限り少ない
'_/   【条件判定の実行】で結果を出せるように設計してあります。
'_/  この関数では、2016年施行の改正祝日法(山の日)までを
'_/   サポートしています。
'_/
'_/ (*1)このマクロを引用するに当たっては、必ずこのコメントも
'_/   一緒に引用する事とします。
'_/ (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
'_/   【 http://www.h3.dion.ne.jp/~sakatsu/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日付)
    If (str祝日名 = "") Then
        If (Weekday(dtm日付) = vbMonday) Then
            ' 月曜以外は振替休日判定不要
            ' 5/6(火,水)の判定は[prv祝日]で処理済
            ' 5/6(月)はここで判定する
            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月
    Case 1
        If (int日 = 1) Then
            prv祝日 = "元日"
        Else
            If (int年 >= 2000) Then
                str第N曜日 = (((int日 - 1) \ 7) + 1) & Weekday(日付)
                If (str第N曜日 = "22") Then  'Monday:2
                    prv祝日 = "成人の日"
                End If
            Else
                If (int日 = 15) Then
                    prv祝日 = "成人の日"
                End If
            End If
        End If
    Case 2
        If (int日 = 11) Then
            If (int年 >= 1967) Then
                prv祝日 = "建国記念の日"
            End If
        ElseIf (日付 = cst昭和天皇の大喪の礼) Then
            prv祝日 = "昭和天皇の大喪の礼"
        End If
    Case 3
        If (int日 = prv春分日(int年)) Then  ' 1948〜2150以外は[99]
            prv祝日 = "春分の日"            ' が返るので、必ず≠になる
        End If
    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
    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
    Case 6
        If (日付 = cst徳仁親王の結婚の儀) Then
            prv祝日 = "皇太子徳仁親王の結婚の儀"
        End If
    Case 7
        If (int年 >= 2003) Then
            str第N曜日 = (((int日 - 1) \ 7) + 1) & Weekday(日付)
            If (str第N曜日 = "32") Then  'Monday:2
                prv祝日 = "海の日"
            End If
        ElseIf (int年 >= 1996) Then
            If (int日 = 20) Then
                prv祝日 = "海の日"
            End If
        End If
    Case 8
        If (int日 = 11) Then
            If (int年 >= 2016) Then
                prv祝日 = "山の日"
            End If
        End If
    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  '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
    Case 10
        If (int年 >= 2000) Then
            str第N曜日 = (((int日 - 1) \ 7) + 1) & Weekday(日付)
            If (str第N曜日 = "22") Then  'Monday:2
                prv祝日 = "体育の日"
            End If
        ElseIf (int年 >= 1966) Then
            If (int日 = 10) Then
                prv祝日 = "体育の日"
            End If
        End If
    Case 11
        If (int日 = 3) Then
            prv祝日 = "文化の日"
        ElseIf (int日 = 23) Then
            prv祝日 = "勤労感謝の日"
        ElseIf (日付 = cst即位礼正殿の儀) Then
            prv祝日 = "即位礼正殿の儀"
        End If
    Case 12
        If (int日 = 23) Then
            If (int年 >= 1989) 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 用祝日判定コード 】  2003/3/2 追記 , 2005/5/20 [昭和の日]改正の修正 , 2014/5/29 [山の日]改正の修正
    VBAコードのロジックを、そのまま[ASP上のVBS ]用に書き直したものです。
    「立野 徹」さんによる編集です。
    VBAとの違いは、
        (1) 変数名等に日本語名が使えない
        (2) 変数の属性は全て[Variant](なので、Dim宣言は無くなってます)
    土日なども一緒に判定するなど条件を付加する場合は、こちらの解説を参考にして下さい。

    『祝日について

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


<%
'================================================================
'=
'= VBScript用祝日算出関数
'=
'=    VBSでは日本語変数名が利用できませんので、英数字変数名に統一
'=    しています。また、変数定義(dim)を省略しています。それ以外の部
'=    分については、角田氏作成のVBコードを利用しています。
'= 
'=      コードの取り込み(1)
'=      (複数のプログラムで利用する場合、こちらの方法がお勧め)
'=        本コードをGetHoliday.aspとして保存し、利用するプログラ
'=        ムに、次のステートメントを加えます。
'=          <!-- #Include virtual="./GetHoliday.asp" -->
'=        (ファイル名等は保存場所により適宜変更して下さい)
'=      コードの取り込み(2)
'=        本コードをプログラムに書き加えます。
'=
'=      取り込み時の注意
'=        VBSは<%〜%>の間に記述しなければなりませんので、本
'=        コードの先頭に <% と、末尾に %> があります。場合によって
'=        は削除しても構いません(<%, %>は半角で記述)。
'=
'=      利用方法
'=        ktHolidayName(日付)とし、日付は内部形式Date(日付型)の
'=        Variant型を関数に引き渡して下さい。戻り値は文字列です。
'=          例:ktHolidayName(Now)〜今日の祝日名(文字列)を取得
'=
'================================================================
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/
'_/  CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
'_/  ( http://www.h3.dion.ne.jp/~sakatsu/index.htm )
'_/
'_/    この祝日マクロは『kt関数アドイン』で使用しているものです。
'_/    このロジックは、レスポンスを第一義として、可能な限り少ない
'_/    【条件判定の実行】で結果を出せるように設計してあります。
'_/    この関数では、2016年施行の改正祝日法(山の日)までを
'_/    サポートしています。
'_/
'_/  (*1)このマクロを引用するに当たっては、必ずこのコメントも
'_/      一緒に引用する事とします。
'_/  (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
'_/      【 http://www.h3.dion.ne.jp/~sakatsu/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)
  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
          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
  Case 1
    If (inthi = 1) Then
      prvhday = "元日"
    Else
      If (intnen >= 2000) Then
        strnyobi = (((inthi - 1) \ 7) + 1) & Weekday(hday)
        If (strnyobi = "22") Then    'Monday:2
          prvhday = "成人の日"
        End If
      Else
        If (inthi = 15) Then
          prvhday = "成人の日"
        End If
      End If
    End If
  Case 2
    If (inthi = 11) Then
      If (intnen >= 1967) Then
        prvhday = "建国記念の日"
      End If
    ElseIf (hday = csttaiso) Then
      prvhday = "昭和天皇の大喪の礼"
    End If
  Case 3
    If (inthi = prvsyunbun(intnen)) Then    ' 1948〜2150以外は[99]
      prvhday = "春分の日"    ' が返るので、必ず≠になる
    End If
  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
  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
  Case 6
    If (hday = cstnorihito) Then
      prvhday = "皇太子徳仁親王の結婚の儀"
    End If
  Case 7
    If (intnen >= 2003) Then
      strnyobi = (((inthi - 1) \ 7) + 1) & Weekday(hday)
      If (strnyobi = "32") Then    'Monday:2
        prvhday = "海の日"
      End If
    ElseIf (intnen >= 1996) Then
      If (inthi = 20) Then
        prvhday = "海の日"
      End If
    End If
  Case 8
    If (inthi = 11) Then
      If (intnen >= 2016) Then
        prvhday = "山の日"
      End If
    End If
  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    '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
  Case 10
    If (intnen >= 2000) Then
      strnyobi = (((inthi - 1) \ 7) + 1) & Weekday(hday)
      If (strnyobi = "22") Then    'Monday:2
        prvhday = "体育の日"
      End If
    ElseIf (intnen >= 1966) Then
      If (inthi = 10) Then
        prvhday = "体育の日"
      End If
    End If
  Case 11
    If (inthi = 3) Then
      prvhday = "文化の日"
    ElseIf (inthi = 23) Then
      prvhday = "勤労感謝の日"
    ElseIf (hday = cstsokui) Then
      prvhday = "即位礼正殿の儀"
    End If
  Case 12
    If (inthi = 23) Then
      If (intnen >= 1989) 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 用祝日判定コード 】  2003/5/6 追記 , 2005/5/20 [昭和の日]改正の修正
                                           2007/4/11 [11月]の部分で、変数の$抜けを修正
                                           2007/5/26 [ 5月]の部分で、if 条件のカッコ不足を修正
                                           2014/5/29 [山の日]改正の修正

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

    『祝日について

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

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


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

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

//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/
//_/  CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved.
//_/  ( http://www.h3.dion.ne.jp/~sakatsu/index.htm )
//_/
//_/    この祝日判定コードは『Excel:kt関数アドイン』で使用している
//_/    VBAマクロを[PHP]に移植したものです。
//_/    この関数では、2016年施行の改正祝日法(山の日)までを
//_/   サポートしています。
//_/
//_/  (*1)このコードを引用するに当たっては、必ずこのコメントも
//_/      一緒に引用する事とします。
//_/  (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。
//_/      【 http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm 】
//_/      へのリンクによる紹介で対応して下さい。
//_/  (*3)[ktHolidayName]という関数名そのものは、各自の環境に
//_/      おける命名規則に沿って変更しても構いません。
//_/  
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

function ktHolidayName($MyDate)
{
  define("MONDAY","2");

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

  $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 = "";
              }
          } else {
              $Result = "";
          }
      } else {
          $Result = "";
      }
  } else {
      $Result = $HolidayName;
  }

  return $Result;
}

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

function prvHolidayChk($MyDate)
{
  define("MONDAY","2");
  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") {    //Monday:2
                  $Result = "成人の日";
              } else;
          } else {
              if ($MyDay == 15) {
                  $Result = "成人の日";
              } else;
          }
      }
      break;
  // 2月 //
  case 2:
      if ($MyDay == 11) {
          if ($MyYear >= 1967) {
              $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) {
              // 07/5/26 if 条件の一番外側のカッコ不足を修正
              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:
      if ($MyYear >= 2003) {
          $strNumberOfWeek = 
                    (floor(($MyDay - 1) / 7) + 1) . Weekday($MyDate);
          if ($strNumberOfWeek == "32") {    //Monday:2
              $Result = "海の日";
          } else;
      } elseif ($MyYear >= 1996) {
          if ($MyDay == 20) {
              $Result = "海の日";
          } else;
      } else;
      break;
  // 8月 //
  case 8:
      if ($MyDay == 11) {
          if ($MyYear >= 2016) {
              $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") {    //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:
      if ($MyYear >= 2000) {
          $strNumberOfWeek = 
                    (floor(( $MyDay - 1) / 7) + 1) . Weekday($MyDate);
          if ($strNumberOfWeek == "22") {    // 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) {    // 07/04/11 $抜け修正
          $Result = "即位礼正殿の儀";
      } else;
      break;
  // 12月 //
  case 12:
      if ($MyDay == 23) {
          if ($MyYear >= 1989) {
              $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;  // 日(1),月(2)‥‥土(7)
}

function Year($MyDate){
  return strftime("%Y",$MyDate) - 0;  // 数値で返す
}

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

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

//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
//_/  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.