直前・直後の平日(銀行営業日)の取得(日付の処理2)

2022年2月18日金曜日

VB.NET 日付操作

t f B! P L
今回も前回に引き続き日付の計算についてのテクニックを
御紹介したいと思います。

前回は月末の日付を取得する方法を御紹介いたしました。
この方法は入金や支払の予定日を計算するのに役立ちます。
この入金日や支払日が土日や祝日などで銀行の休業日の場合、
実際に銀行口座への入金や銀行口座からの引き落としは
直後の営業日または直前の営業日に行われることとなります。
今回はこの銀行営業日を考慮し、
指定された日付の直前または直後の平日(=銀行営業日)を
取得する方法を御紹介いたします。

まず曜日に関しては「DayOfWeekプロパティ」で取得することが可能です。
このプロパティには曜日を表す数値を日曜"0"~土曜日"6"として
取得することができます。
また「DayOfWeek列挙体」を使用すると、
より分かりやすくプログラミングすることができます。

Dim dteDate As Date = "2022/02/09"
dteDate.DayOfWeek    '←DayOfWeek.Wednesday

これで指定された日付が土曜・日曜の銀行休業日に当たるかの判断は可能です。
祝祭日に関しても計算で取得することは可能です。
ただし計算で求めた場合、振替休日の計算を行う必要があったり、
祝日法の改正等でシステム開発後に祝祭日が変更される可能性があります。
(ここ数年はオリンピックの延期によりカレンダーの印刷なども
 問題になってましたね・・・。)
システム開発後に祝日の変更による更新が発生してしまうので
メンテナンスが非常に大変です。
システム上は「休日設定」のような機能を設け、
データベースなどに祝日を格納しておくほうが
使用者自身で対応できるので、システムメンテナンスの手間は
大きく省けるかと思います。

ではサンプルを見てみましょう。

Private Function fncCheckHoliday(pdteDate As Date) As Boolean

    Dim i As Integer
    Dim dteHoliday() As Date

    '休日のリストを配列に格納しておきます。
    '実装時にはデータベースから取得することになります。

    ReDim dteHoliday(16)
    dteHoliday(0) = "2022/01/01"
    dteHoliday(1) = "2022/01/03"   '銀行休業日
    dteHoliday(2) = "2022/01/10"
    ・・・

    '確認対象の日付が休日のリストと一致すれば休日
    For i = 0 To UBound(dteHoliday)
        If pdteDate pdteDate (i) Then
            Return True
        End If
    Next

    '土日の場合は休日、土日以外は平日とみなす
    If pdteDate.DayOfWeek = DayOfWeek.Saturday Or _
       pdteDate.DayOfWeek = DayOfWeek.Sunday Then

        Return True
    Else
        Return False
    End If 
End Function

引数:pdteDate - 確認対象の日付
返値:True - 土日もしくは祝祭日 = 銀行休業日
         False - 平日 = 銀行営業日

上記の関数で指定された日付が休日か平日か判断できます。
あとはこの関数の戻り値が平日になるまで
日付を1日づつ増減することで直前・直後の平日 = 銀行営業日を
取得することが可能です。

'直前の銀行営業日の計算(2022年4月30日の例)
Dim dteCheck As Date

dteCheck = "2022/04/30"

While fncCheckHoliday(dteCheck) = True
    dteCheck dteCheck.AddDays(-1)
End While

2022/4/30は土曜なのでfncCheckHolidayはTrueとなり1日減らす
2022/4/29は祝日なのでfncCheckHolidayはTrueとなり1日減らす
2022/4/28は木曜で祝日でもないのでfncCheckHolidayはFalseとなり処理終了
dteCheckは2022/4/28となります。

'直後の銀行営業日の計算(2022年4月30日の例)
Dim dteCheck As Date

dteCheck "2022/04/30"

While fncCheckHoliday(dteCheck ) = True
    dteCheck dteCheck.AddDays(1)
End While

2022/4/30は土曜なのでfncCheckHolidayはTrueとなり1日増やす
2022/5/1は日曜なのでfncCheckHolidayはTrueとなり1日増やす
2022/5/2は月曜で祝日でもないのでfncCheckHolidayはFalseとなり処理終了
dteCheckは2022/5/2となります。

この処理で支払条件の計算で取得した日付から、
直前または直後の平日を取得できるので、
実際に入金・支払が行われる日を求めることができます。

また、上記の仕組みと前回の記事の機能を利用し作成したプログラムを
note上で公開しております。
もし興味がございましたら御利用ください。

他にもいろいろと方法もございますし、
開発するシステムによっては、よりふさわしい方法もあるかと思いますが、
御参考にしていただければと思います。
サンプルはVB.NETで作成しておりますが、
考え方はどんな言語でも同じですので、
参考にしていただければと思います。

QooQ