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
}

14
Anda dapat membandingkan newStory.Date == DateTime.Now.Date
Guillaume

Jawaban:


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

}
else
{

}

Harus melakukan trik.


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
}

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 */ }

14

Solusi saya:

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

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).


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

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.




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.


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


-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.


-6

Anda bisa menggunakan DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.