【Class Library】


日付計算
 ある年月日から?日後の年月日を求めることは、なかなか難しいものです。 そこで、そういった日付計算を汎用的に行えるものを作ってみました。プログラム理論 は次のようなものです。

1.西暦1年1月1日を0日目と考え、与えられた年月日がその日から 何日目であるか計算する。
2.1で得られた日数に?日をたす。
3.2で得られた日数を年月日に換算する。

 現在のグレゴリオ暦は、1年の日数が4年ごとに366日、 100年ごとに365日、400年ごとに366日というようにややこしく、 一月の日数も28日,29日,30日,31日と4通りも 考えられるので、一見簡単そうに見えても、 1と3の処理を正確に計算し、高速かつ単純なプログラムにすることは、 結構難しいものです。ですから、色々なアルゴリズムが考えられ、 下で示すプログラムコードはほんの一例に過ぎません。


★クラス内の処理内容★

dcnプロシージャが、西暦1年1月1日からの経過日数に換算するプロシージャで、 ncdプロシージャが、西暦1年1月1日からの経過日数を年月日に換算するプロシージャです。 一見このコードで計算できるとは思えないですが、 正確に計算可能です。また、引数はオーバーフローしない範囲で指定できます。 (グレゴリオ暦は1582年からのものなので、それ以前の計算については、 仮定的なものです。)

'============================================================
'dcn   指定された年月日の、西暦1年1月1日からの
'      経過日を返す。
'------引数--------------------------------------------------
'y,m,d  年、月、日
'============================================================
Public Function dcn(ByVal y As Long, ByVal m As Long, _
              ByVal d As Long) As Long
    'うるう年の存在がやっかい
    If m > 2 Then '後のコードでうるう年の29日分をまとめる
        d = d - 367
    Else 'その年のうるう年判定がしなくてすむ
        y = y - 1
    End If
    '月分の補正−1月を30日としている−m \ 2 + m * 30
    m = m - 1
    If m And 9 Then d = d + 1
    dcn = y \ 4 - y \ 100 + y \ 400 + y * 365 _
          + d + m \ 2 + m * 30 - 1
End Function

'============================================================
'ncd   西暦1年1月1日を0日目として、その日からの経過日h日目が
'      ?年?月?日であるかを求める。
'------引数--------------------------------------------------
'h      経過日
'y,m,d  年、月、日の格納変数
'============================================================
Public Sub ncd(h As Long, y As Long, m As Long, d As Long)
    'ラフな年を設定−正確な年は、この年以下である
    'ラフさをなくすコードを追加するとさらに速く処理できる
    y = h \ 365 + 1
    'まず、yを特定する
    'dcnプロシージャを使うのが効果的
    Do While ((h - dcn(y, 1, 1)) < 0)
        y = y - 1
    Loop
    d = 0
    m = 13
    '月日の特定、ここでもdcnプロシージャを使う
    Do While (d < 1)
        m = m - 1
        d = h - dcn(y, m, 0)
    Loop
End Sub


★クラスの使用法★

 ある日付から?日後の日付を求める場合、次のようなコードで求める ことができます。

    Dim cd As New CDayConvert
    Dim y As Long, m As Long, d As Long
    Dim sday As Long
    '指定された年月日の西暦1年1月1日からの経過日
    sday = cd.dcn(ある年, , )
    '?日後の日付を得る
    Call cd.ncd(sday + ?日後, y, m, d)
    Label.Caption = y & "年" & m & "月" & d & "日です"


(謝礼)
このプログラムは、(株)ハル研究所主催のプログラミングコンテスト での応募作品を元に作りました。(株)ハル研究所さんの御好意がなければ 作れなかったものでありますし、こういう機会を与えていただいたことに とても感謝しています。


(サンプルプログラムの動作確認)

機種 PC-9821V13S
OS Windows95
開発ツール Visual Basic Ver.4.0
更新日 00/2/10

ダウンロード DayConvert.lzh(3.00KB)

Visual Basic Ver.5.0,Ver.6.0でも問題なく動作すると思います。
なお、このコーナーに掲載されているプログラムコード、およびプログラムファ イルが原因で起きた損害などに関して一切の責任を負うことはできません。

★このコーナーに掲載されているプログラムコード、およびプログラムファ イルを無断で配布・転載することは、原則として禁止です。


Class Libraryインデックス トップページ


Copyright(C)2000 Tomoya. All rights reserved.