DateTimeが今日発生するかどうかを確認するにはどうすればよいですか?


110

DateTimeが「今日」発生したかどうかを確認するより良い.netの方法は、次のコードですか?

if ( newsStory.WhenAdded.Day == DateTime.Now.Day &&
     newsStory.WhenAdded.Month == DateTime.Now.Month &&
     newsStory.WhenAdded.Year == DateTime.Now.Year )
{ 
    // Story happened today
}
else
{ 
    // Story didn't happen today
}

14
newStory.Date == DateTime.Now.Date
Guillaumeを

回答:


222
if (newsStory.WhenAdded.Date == DateTime.Today)
{

}
else
{

}

トリックを行う必要があります。


3
...もしnewsStory.Dateが実際には日付部分のみであり、時間がない場合。;)
Lucero、

14
...これは、newsStoryがDateTimeの場合
スティーブメグソン、2009年

18
さて、DateTimeは.NET Frameworkクラスライブラリの一部であるため、OPがたまたま同じ名前を共有する独自のクラスを作成した可能性がありますが、なぜカスタムクラスの使用方法をStackOverflowに尋ねるのか不思議に思うはずです。彼は作成し、それがどのように機能するかを魔法のように知るように期待しています。;)
ブライアンシュロス

2
@Luceroは可能ですが、質問のタイトルは「2つの日時」と表示されます。;)欠けている型を取得したのはここだと思います。
火葬丘

1
@HansPetterNaumannこれは論理的です:) DateTime.AddHours()は新しいDateTimeオブジェクトを返します。したがって、実際には時間コンポーネントがなかった.Today操作を効果的にキャンセルします。
pyrocumulus

29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}

5
追加したいと思います、それは非常に一般的です(そしてバグを見つけるのは難しいです)-DateTimeをDateTime.Todayと比較するだけです。
JL。


14

私の解決策:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}

7

NewsStoryがDateTimeも使用していた場合は、Dateプロパティを比較するだけで完了です。

しかし、これは「今日」が実際に何を意味するかによって異なります。真夜中の直前に投稿されたものは、しばらくすると「古い」ものになります。したがって、ストーリーの正確な日付(時間、できればUTCを含む)を維持し、24時間未満(または何でも)が経過したかどうかを確認するのが最善でしょう。これは簡単です(日付を差し引くことができ、これにより、TotalHoursまたはTotalDaysプロパティ)。


5

DateTime拡張メソッドを実装できます。

拡張メソッドの新しいクラスを作成します。

namespace ExtensionMethods
{
    public static class ExtensionMethods
    {
        public static bool IsSameDay( this DateTime datetime1, DateTime datetime2 )
        {
            return datetime1.Year == datetime2.Year 
                && datetime1.Month == datetime2.Month 
                && datetime1.Day == datetime2.Day;
        }
    }
}

そして今、あなたのコードのどこにでも、このテストをどこで実行したいのですか?

using ExtensionMethods;

次に、拡張メソッドを使用します。

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
なぜ単にdatetime1.Date == datetime2.Dateを返さないのですか?
Sergiu Mindras 2013年

@SergiuMindrasは正しいです。常に00:00:00になるDateため、両方を比較するだけで十分TimeSpanです。
GoRoS 2014年

5

ご参考までに、

newsStory.Date == DateTime.Today

コーディングと同じ比較結果を返します

newsStory == DateTime.Today

オブジェクトnewsStoryはどこDateTimeですか

.NETは、日付のみに基づいて比較するかどうかを判断するのに十分なほどスマートであり、内部の比較にそれを使用します。理由は不明ですが、実際にこの動作に関するドキュメントを見つけるのに苦労しています。




1

さて、DateTimeには "Date"プロパティがあり、それに基づいて比較できます。しかし、ドキュメントを見ると、そのプロパティを取得すると、実際には時刻コンポーネントが午前0時に設定された新しい日時がインスタンス化されるようです。そのため、個々のコンポーネントへのアクセスよりもはるかに遅くなる可能性があります。


スローダウン(存在する場合)は非常に小さいので、ほとんどすべての場合に問題にはなりません。確かに時期尚早の最適化のケース。
Pedersen、

同意-最近のコーディングの世界では可読性と保守性が重視されているため、最近では時期尚早の最適化を排除することがますます難しくなっています。古い習慣は死ぬ!
Peter Bridger


-4

いかがですか

if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
{ // Story happened today
}

しかし、これは2008年1月1日と2009年1月1日についてもtrueを返します。


-6

あなたは使うことができます DateTime.Now.DayOfYear

 if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
 { // story happened today

 }
 else
 { // story didn't happen today

 }

1
これでうまくいくとは思いません。今日が2009年10月21日で、newsStoryが2008年10月21日である場合、trueが返されます(ここではうるう年は考慮していません)。
フィリップウォレス

2
これは年を区別しませんnew DateTime(2009、10、01).DayOfYear == new DateTime(1900、10、01).DayOfYear;
デイブダウンズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.