● 日付型クラス ●

ダウンロード (26KB)

せっかく sprintf を作ったんだから、ちょっとばかし活用したいのうと思ったのだが、…意外と使い道がない。必死で頭をひねったところ、日付表現で使えるのではないかと想起。ということで作ってみた。

具体的な機能としては、今のところ日数加算・減算処理しか実装していない。SYSTEMTIME構造体とFILETIME構造体の双方向変換、FILETIME構造体と64ビット値(ULongLong型、VBでは要するにCurrency型)の双方向変換に心血を注いでしまい、力尽きてしまったのだよ。月数計算やら年数計算などの実装、その他の動作確認はあなたにまかせましたぞ!!

[日数計算について参考にしたページ]
http://support.microsoft.com/kb/188768/ja

以上が2010年9月2日までのお話で、これ以降は2010年9月4日のお話。

もうちょっと色々出来そうなので色々と頑張ってみたのさ。月数計算や年数計算なども若干機能制約付きではあるが実装してみた。細かいエラー処理、例えばFILETIME構造体で保持される値の最古年は1601年であるが、それより古い日付が指定された場合などの実装はしていない。上記でも述べたが、主眼はSYSTEMTIME構造体とFILETIME構造体と64ビット値(ULongLong型、VBでは要するにCurrency型)の研究なのでね。

以下に今回の処理で最も重要であったポイントを2点挙げておく。

◆通貨型(Currency)について、VB付属のヘルプより抜粋

64ビット(8バイト)の変数です。整数形式で表され、10,000倍されて整数として記憶された、
15 桁の整数部分と 4 桁の小数部分を持つ固定小数点数です。
-922,337,203,685,477.5808 〜 922,337,203,685,477.5807 の範囲の値をとります。

◆FILETIME構造体データ⇔Currency型(=64ビット値(ULongLong型))変換について

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef dest As Any, ByRef src As Any, ByVal dwLen As Long)

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:FILETIME構造体データをCurrency型(=64ビット値(ULongLong型))に変換する
' 引  数:(i)Curr  … Currencyデータ
'         (i)udtFT … FILETIME構造体データ
' 返り値:なし
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Private Sub FileTimeToCurr(ByRef Curr As Currency, ByRef udtFT As FILETIME)
    Call CopyMemory(ByVal VarPtr(Curr), ByVal VarPtr(udtFT.dwLowDateTime), 4)
    Call CopyMemory(ByVal VarPtr(Curr) + 4, ByVal VarPtr(udtFT.dwHighDateTime), 4)
End Sub

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:Currency型(=64ビット値(ULongLong型))をFILETIME構造体データに変換する
' 引  数:(i)udtFT … FILETIME構造体データ
'         (i)Curr  … Currencyデータ
' 返り値:なし
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Private Sub CurrToFileTime(ByRef udtFT As FILETIME, ByRef Curr As Currency)
    Call CopyMemory(ByVal VarPtr(udtFT.dwLowDateTime), ByVal VarPtr(Curr), 4)
    Call CopyMemory(ByVal VarPtr(udtFT.dwHighDateTime), ByVal VarPtr(Curr) + 4, 4)
End Sub

戻る