none
DateTime型の比較(msを除く比較方法) RRS feed

  • 質問

  • お世話になっております。

    表題のとおり、DateTime型の比較についてなのですが
    同じ型であれば、比較演算子によって比較できると認識しています。

    ですが、上図の場合

    値は同じになっているのに、どうしてif文の中に入ってしまっているのでしょうか?

    識者の方、どうかご教示ください。


    • 編集済み コーベル 2015年8月18日 1:47 タイトルを解りやすく変更
    2015年8月18日 0:54

回答

  • 秒単位で比較ということで、ちょっと検索してみました。
    TotalSecondsメソッドがよく用いられているようですね。

    (例)
    Compare datetime without millisecond
    http://stackoverflow.com/questions/6074387/compare-datetime-without-millisecond

    How to compare two DateTime to seconds?
    http://stackoverflow.com/questions/3816163/how-to-compare-two-datetime-to-seconds


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年8月18日 1:32
    モデレータ
  • ウォッチに表示されてる書式が秒までなだけで、ミリ秒単位が違うんじゃないんですか?
    • 回答としてマーク コーベル 2015年8月18日 1:30
    2015年8月18日 1:14
  • DateTimeの比較は、内部的にはInternalTickで比較されています。すなわち、Compareメソッドと同じことを行っていますので、Compareメソッドにおける注意点と同じことが言えます。すなわち、タイムゾーンを揃えて比較する必要があります。例えば、日本時間とUTCのようにタイムゾーンが違えば、単純に比較できません。
    また、InternalTickはInt64でミリ秒以下の精度もありますので、秒より小さい部分が違っている可能性もあります。よって、比較する場合は、秒の部分まで比較するなど工夫が必要になります。例えば、秒までの精度で新しいDateTime型をそれぞれ作り直して、それを比較する方法です。DateTimeはイミュータブルなので、一度作成したインスタンスが保持している値等を変更することはできません。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク コーベル 2015年8月18日 1:30
    2015年8月18日 1:25
    モデレータ
  • trapemiyaさんもコメントされていますが、DateTimeの比較はパフォーマンスを考慮してTicks(内部的にはInternalTicks)を使用して比較されています。秒単位での比較を望まれるのであれば
    left.Ticks / TimeSpan.TicksPerSecond < right.Ticks / TimeSpan.TicksPerSecond

    でどうでしょうか?

    • 回答としてマーク コーベル 2015年8月18日 1:42
    2015年8月18日 1:28

すべての返信

  • ウォッチに表示されてる書式が秒までなだけで、ミリ秒単位が違うんじゃないんですか?
    • 回答としてマーク コーベル 2015年8月18日 1:30
    2015年8月18日 1:14
  • ご回答ありがとうございます。

    おっしゃる通り、ms、ticksで差異が出ておりました、、、、、、

    お恥ずかしい限りですが、ではこの場合(DateTime)で秒までで比較する場合、どうすればよいのでしょうか?

    当該データを加工(不要部分を0クリア)等で比較するのがセオリーなのでしょうか?

    2015年8月18日 1:21
  • DateTimeの比較は、内部的にはInternalTickで比較されています。すなわち、Compareメソッドと同じことを行っていますので、Compareメソッドにおける注意点と同じことが言えます。すなわち、タイムゾーンを揃えて比較する必要があります。例えば、日本時間とUTCのようにタイムゾーンが違えば、単純に比較できません。
    また、InternalTickはInt64でミリ秒以下の精度もありますので、秒より小さい部分が違っている可能性もあります。よって、比較する場合は、秒の部分まで比較するなど工夫が必要になります。例えば、秒までの精度で新しいDateTime型をそれぞれ作り直して、それを比較する方法です。DateTimeはイミュータブルなので、一度作成したインスタンスが保持している値等を変更することはできません。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク コーベル 2015年8月18日 1:30
    2015年8月18日 1:25
    モデレータ
  • trapemiyaさんもコメントされていますが、DateTimeの比較はパフォーマンスを考慮してTicks(内部的にはInternalTicks)を使用して比較されています。秒単位での比較を望まれるのであれば
    left.Ticks / TimeSpan.TicksPerSecond < right.Ticks / TimeSpan.TicksPerSecond

    でどうでしょうか?

    • 回答としてマーク コーベル 2015年8月18日 1:42
    2015年8月18日 1:28
  • いつも、的確なご回答ありがとうございます。

    例えば、秒までの精度で新しいDateTime型をそれぞれ作り直して、それを比較する方法です。DateTimeはイミュータブルなので、一度作成したインスタンスが保持している値等を変更することはできません。

    なるほど、そういうことなのですね。

    ありがとうございました!

    2015年8月18日 1:29
  • 秒単位で比較ということで、ちょっと検索してみました。
    TotalSecondsメソッドがよく用いられているようですね。

    (例)
    Compare datetime without millisecond
    http://stackoverflow.com/questions/6074387/compare-datetime-without-millisecond

    How to compare two DateTime to seconds?
    http://stackoverflow.com/questions/3816163/how-to-compare-two-datetime-to-seconds


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年8月18日 1:32
    モデレータ
  • 佐祐理さん、trapemiyaさん

    ご回答ありがとうございます。

    new DateTime(LastVisit.Year, LastVisit.Month, LastVisit.Day, LastVisit.Hour, LastVisit.Minute, LastVisit.Second);

    などという形で比較しようとしていましたが、そのようなスマートなコードが
    あったのですね。

    ありがとうございます、勉強させていただきました!

    2015年8月18日 1:42