質問: #1899-12-31 00:00:01# MsgBox CStr(x + y) ' 0:00:00 ``` (1)はいいでしょう。`x + (y - 基準日)`で求まります。 (2)は、加算する一方のみが基準日である1899/12/30 00:00:00よりも前の場合に計算方法が切り替わることを表しています。 基準日を「またぐ」場合とみなせ、`x < 基準日 && 基準日 <= y`の場合は`x - (y - 基準日)`、`y < 基準日 && 基準日 <= x`の場合は`y - (x - 基準日)`となっているようです。 (3)は、加算する両方が基準日よりも前の場合にも、やはり計算方法が切り替わることを表しています。 (1)と同じ計算方法になっているようです。 (4)は、基準日より前の時間の流れ方と、基準日より後の時間の流れ方が異なっていることを表しています。基準日からどれくらい離れているかの量が、x(-23:59:59)とy(+24:00:01)とで違うにもかかわらず、結果が0:00:00になっています。 この結果と、(2)を整合させるための条件が分かりません(予想では30日というのが特別扱いされている・・・?未検証)。 この他にも、上で挙げた条件以外の条件が絡んできそうで悩んでいます。 「ここに仕様があるよ」という意見と、「こういう条件があるよ」というのを知っている方は教えてください。 お願いします。 追記: 既存の加算を使ったコードを挙動を変更することなく移植する必要があるため、DateAddを使えばいい、という話ではありません。
回答: 当方 VBS にはあまり詳しくないので細かい用語は間違っているかもしれませんが... これは Date を `CDbl` を通して内部表現を見ればわかります。 ``` WScript.Echo CDbl(#1899-12-29 00:00:00#) WScript.Echo CDbl(#1899-12-29 12:00:00#) WScript.Echo CDbl(#1899-12-30 00:00:00#) WScript.Echo CDbl(#1899-12-30 12:00:00#) WScript.Echo CDbl(#1899-12-31 00:00:00#) ``` 基準時の周りを 12 時間間隔で `double` に変換して表示します。結果は: ``` -1 -1.5 0 0.5 1 ``` です。 `#1899-12-29 12:00:00#` の値がそれ以前の `#1899-12-29 00:00:00#` よりも **小さく** なっているところに注目してください。 Date の内部表現は、 `<基準日からの日数>.<その日の 00:00:00 からの時間>` つまり、 * 整数部が基準日からの日数(基準日以前は負数になる) * 小数点部がその日の 00:00:00 からの時間 (24時間=1.0に相当) という風になっています。ですから、基準日以前の内部表現の小大と日時としての前後は一致しません。 問題の日付を内部表現であらわすと: * `x = #1899-12-29 00:00:01#` は `x = -1.00001157407407` つまり、基準日-1 の一秒目 * `y = #1899-12-31 00:00:01#` は `y = 1.00001157407407` つまり、基準日+1 の一秒目 Date を無理やり `+` で足す場合はこの内部表現で加算を行い、その後 Date に戻す操作になります。ですから、 `x + y` は `0` となり、上の結果となります。