none
DateAddについて RRS feed

  • 質問

  • 初めてこのフォーラムを利用させていただきます、黒猫です。

     

    さて、DateAddについて調べると、

    	Public Overloads Function DateAdd( _
    	   ByVal Interval As DateInterval, _
    	   ByVal Number As Double, _
    	   ByVal DateValue As DateTime _
    	) As DateTime
    となっていて、8.5時間後とかを計算できそうですが、
            Dim TmpTime As Date = #10:00:00 AM#
            TmpTime = DateAdd(DateInterval.Hour, 8.5, TmpTime)
    の結果は18:00になってしまいます。8時間半後を求めるには、
    8時間後を求めて、さらに30分後を求めるのが正しいやり方ですか?
     
    2007年5月17日 7:47

回答

  •  黒猫工房 さんからの引用
    8時間半後を求めるには、8時間後を求めて、さらに30分後を求めるのが正しいやり方ですか?

    そのとおりで、おそらく最小精度以下の値については偶数丸めを喰らうので 18:00 になってしまっているのでしょう。

    NCL 標準のクラスを使っても同じことです。
    AddHours の後に AddMinutes になります。

    VB.NET
    Dim dtMyBirthday As New System.DateTime(1984, 11, 07)

    dtMyBirthday = dtMyBirthday.AddHours(8)     '8 時間後を取得
    dtMyBirthday = dtMyBirthday.AddMinutes(30)  '30 分後を取得

     

    です。
    2007年5月17日 7:53

すべての返信

  •  黒猫工房 さんからの引用
    8時間半後を求めるには、8時間後を求めて、さらに30分後を求めるのが正しいやり方ですか?

    そのとおりで、おそらく最小精度以下の値については偶数丸めを喰らうので 18:00 になってしまっているのでしょう。

    NCL 標準のクラスを使っても同じことです。
    AddHours の後に AddMinutes になります。

    VB.NET
    Dim dtMyBirthday As New System.DateTime(1984, 11, 07)

    dtMyBirthday = dtMyBirthday.AddHours(8)     '8 時間後を取得
    dtMyBirthday = dtMyBirthday.AddMinutes(30)  '30 分後を取得

     

    です。
    2007年5月17日 7:53
  • じゃんぬねっとさん

     

    回答いただきありがとうございました。

    宣言でDoubleになっているのに、Integer扱いなんて納得できませんが、

    泣く子と地頭(MS)には勝てません…

     

    今後ともよろしくお願いいたします。

    2007年5月17日 8:02
  •  じゃんぬねっと さんからの引用
    NCL 標準のクラスを使っても同じことです。
    AddHours の後に AddMinutes になります。

    VB.NET
    Dim dtMyBirthday As New System.DateTime(1984, 11, 07)

    dtMyBirthday = dtMyBirthday.AddHours(8)     '8 時間後を取得
    dtMyBirthday = dtMyBirthday.AddMinutes(30)  '30 分後を取得

     

    です。

     

    DateTime.AddHours メソッド

    value の小数部は 1 時間の端数です。たとえば、4.5 は 4 時間と、30 分 0 秒 0 ミリ秒 0 タイマ刻みに相当します。

    value パラメータは、近似値のタイマ刻みに丸められます。

    だそうですよ?

    2007年5月17日 8:25
  •  Hongliang さんからの引用
    だそうですよ?

    あ、DateAdd 関数とは違う仕様なのですね。
    DateAdd 関数がそうなら、同じく丸められるのかと決め付けておりました。

    Code Snippet
    Dim dtMyBirthday As New System.DateTime(1984, 11, 07)

    dtMyBirthday = dtMyBirthday.AddHours(8.5)     '8.5 時間後を取得

     

    どうやら、System.DateTime.AddMonth メソッドでは問題ないようですね。
    2007年5月17日 11:54
  • VB2003 の話ですが、次の呼び出しを混合モードで追ってみました。 

    DateAdd(DateInterval.Hour, 1.5, DateValue)

    #解析は専門でないので、間違いがあるかもしれません。

    動作のうち重要と思われる部分のみ書きますが、

    まず最初に Fix(1.5) が呼び出されました。

    次に、どういうわけか 1.0 に対して、丸め操作を行なうアセンブリ命令が実行されました。

    もちろんこの 1.0 というのは、Fix の戻り値です。

    それから、DateTime.AddHours(1.0) が呼び出されました。

    この場合のオブジェクト参照は、恐らく DateValue と思われます。

    以上から、小数点以下は丸められているのでなく、切り捨てられている可能性があります。

    2007年5月17日 14:07