Bagaimana cara memeriksa apakah DateTime terjadi hari ini?

110

Apakah ada cara .net yang lebih baik untuk memeriksa apakah DateTime telah terjadi 'hari ini' daripada kode di bawah?

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
}
Peter Bridger
sumber
14
Anda dapat membandingkan newStory.Date == DateTime.Now.Date
Guillaume

Jawaban:

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

}
else
{

}

Harus melakukan trik.

pyrocumulus
sumber
3
... jika newsStory.Date sebenarnya hanya porsi tanggal, tanpa waktu. ;)
Lucero
14
... yang mana, jika newsStory adalah DateTime
stevemegson
18
baik, DateTime adalah bagian dari Perpustakaan Kelas .NETFramework, jadi meskipun memungkinkan OP membuat kelasnya sendiri yang kebetulan memiliki nama yang sama, Anda harus bertanya-tanya mengapa dia bertanya kepada StackOverflow cara menggunakan kelas kustom. dia menciptakan dan mengharapkan kita secara ajaib mengetahui cara kerjanya. ;)
Brian Schroth
2
@ Lucero itu mungkin, tetapi judul pertanyaannya bertuliskan 'dua Tanggal Waktu'. ;) Saya kira dari situlah kami mendapatkan tipe yang hilang itu.
pyrocumulus
1
@HansPetterNaumann itu logis :) DateTime.AddHours () mengembalikan objek DateTime baru, sehingga secara efektif membatalkan operasi .Today Anda yang memang tidak memiliki komponen waktu.
pyrocumulus
29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}
Dave D
sumber
5
Saya ingin menambahkan, ini adalah bug yang sangat umum (dan sulit dikenali) - hanya membandingkan DateTime dengan DateTime.Today.
JL.
16

Mencoba

if (newsStory.Date == DateTime.Now.Date) 
{ /* Story happened today */ }
else
{ /* Story didn't happen today */ }
Stephen Newman
sumber
14

Solusi saya:

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

Jika NewsStory juga menggunakan DateTime, bandingkan saja properti Date, dan Anda sudah selesai.

Namun, ini tergantung pada apa sebenarnya arti "hari ini". Jika sesuatu diposting sebelum tengah malam, itu akan menjadi "lama" setelah waktu yang singkat. Jadi mungkin akan lebih baik untuk menyimpan tanggal cerita yang tepat (termasuk waktu, sebaiknya UTC) dan memeriksa apakah kurang dari 24 jam (atau apa pun) telah berlalu, yang sederhana (tanggal dapat dikurangi, yang memberi Anda TimeSpan dengan TotalHours atau properti TotalDays).

Lucero
sumber
5

Anda dapat menerapkan metode ekstensi DateTime.

Buat kelas baru untuk metode ekstensi Anda:

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;
        }
    }
}

Dan sekarang, di mana pun pada kode Anda, di mana Anda ingin melakukan tes ini, Anda harus menyertakan penggunaan:

using ExtensionMethods;

Dan kemudian, gunakan metode ekstensi:

newsStory.WhenAdded.IsSameDay(DateTime.Now);
Benjamim
sumber
3
mengapa tidak mengembalikan datetime1.Date == datetime2.Date?
Sergiu Mindras
@SergiuMindras benar, cukup membandingkan keduanya Datekarena TimeSpanakan selalu 00:00:00.
GoRoS
5

FYI,

newsStory.Date == DateTime.Today

akan mengembalikan hasil perbandingan yang sama dengan pengkodean

newsStory == DateTime.Today

dimana newsStoryaDateTime benda

NET cukup pintar untuk menentukan Anda ingin membandingkan berdasarkan Tanggal saja dan menggunakannya untuk Bandingkan internal. Tidak yakin mengapa, dan benar-benar kesulitan menemukan dokumentasi untuk perilaku ini.

guck
sumber
4

Seperti yang disarankan Guillame dalam komentar , bandingkan nilai Dateproperti:

newStory.Date == DateTime.Now.Date
Anton Gogolev
sumber
2

Coba ini:

newsStory.Date == DateTime.Today
Philip Wallace
sumber
1

baik, DateTime memiliki properti "Tanggal" dan Anda bisa membandingkan berdasarkan itu. Namun melihat dokumennya, tampaknya mendapatkan properti tersebut sebenarnya membuat waktu baru dengan komponen waktu disetel ke tengah malam, jadi mungkin lebih lambat daripada mengakses masing-masing komponen, meskipun jauh lebih bersih dan lebih mudah dibaca.

Brian Schroth
sumber
Saya pikir perlambatan (jika ada) akan sangat kecil sehingga tidak masalah di hampir semua kasus. Tentu saja kasus pengoptimalan prematur.
Esben Skov Pedersen
Setuju - akhir-akhir ini saya merasa semakin sulit untuk menghilangkan pengoptimalan prematur karena dunia pengkodean modern lebih mengutamakan keterbacaan dan pemeliharaan. Kebiasaan susah hilang!
Peter Bridger
0

if (newsStory.ToShortDateString() == DateTime.Today.ToShortDateString()) return "Todtay";

Sasan Salem
sumber
-4

Bagaimana tentang

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

Tetapi ini juga akan kembali benar untuk 1 Januari 2008 dan 1 Januari 2009, yang mungkin atau mungkin tidak sesuai dengan keinginan Anda.

Polyfun
sumber
-6

Anda bisa menggunakan DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }
Ryan Alford
sumber
1
Saya tidak berpikir ini akan berhasil. Jika hari ini adalah 10/21/2009, dan newsStory adalah 10/21/2008 - itu akan menjadi true (saya tidak memperhitungkan tahun kabisat di sini).
Philip Wallace
2
Ini tidak akan membedakan antara tahun DateTime baru (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D