DateTime. Bandingkan bagaimana cara memeriksa apakah tanggalnya kurang dari 30 hari?

86

Saya mencoba mencari tahu apakah akun kedaluwarsa dalam waktu kurang dari 30 hari. Apakah saya menggunakan Perbandingan DateTime dengan benar?

if (DateTime.Compare(expiryDate, now) < 30)

{
     matchFound = true;
}
David Basarab
sumber

Jawaban:

234

Apakah saya menggunakan Perbandingan DateTime dengan benar?

Tidak. CompareHanya menawarkan informasi tentang posisi relatif dua tanggal: kurang, sama, atau lebih besar. Yang Anda inginkan adalah seperti ini:

if ((expiryDate - DateTime.Now).TotalDays < 30)
    matchFound = true;

Ini mengurangi dua DateTimes. Hasilnya adalah TimeSpanobjek yang memiliki TotalDaysproperti.

Selain itu, kondisional dapat ditulis langsung sebagai:

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

Tidak ifperlu.

Konrad Rudolph
sumber
2
Harus diizinkan memberi Anda 2+;) satu untuk jawaban dan satu untuk cara singkat untuk mengekspresikannya
CheGueVerra
4
Uh… Saya baru saja membuat jawaban saya lebih lama jadi silakan kurangi satu suara imajiner. ;-)
Konrad Rudolph
1
Silakan gunakan TotalDayssebagai pengganti hari.
João Portela
2
Ini secara konseptual lebih akurat. Tidak ada bedanya karena Daysmerupakan komponen terbesar TimeSpan. Orang yang membaca ini dapat memperkirakan hal itu dengan berpikir bahwa Secondsproperti tersebut bekerja dengan cara yang sama.
João Portela
2
Menambah poin yang dibuat João Portela, bahkan Daysdirinya sendiri juga bisa salah. Daysdan TotalDayssama di sini hanya karena kondisinya < 30, tetapi akan ada perbedaan yang jelas jika dulu <= 30, karena TotalDaysmungkin mengembalikan sesuatu seperti 30.421saat Daysmasih kembali 30.
Racil Hilan
15

seharusnya

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

catat total hari jika tidak, Anda akan mendapatkan perilaku werid

Luke
sumber
jawaban ini lebih dari setahun setelah pengeditan terakhir pada jawaban yang diterima!
Mitch Wheat
@Mitch - Ini adalah jawaban yang benar, perhatikan bahwa dia menggunakan TotalDays daripada Days.
Marcelo Mason
Jawaban yang diterima benar. TotalDays juga menampilkan bagian pecahan, yang berlebihan jika dibandingkan dengan bilangan bulat.
Mitch Wheat
1
@MitchWheat TotalDayssecara konseptual adalah bidang yang benar untuk digunakan. Pada prakteknya mereka memberikan hasil yang sama tetapi hanya karena Daysmerupakan komponen terbesar TimeSpan, seandainya ada komponen Bulan atau Tahun dan ini akan menjadi cerita yang berbeda. Coba saja Hours, Secondsatau Millisecondslihat cara kerjanya.
João Portela
7

Saya akan melakukannya seperti ini:

TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30) 
   matchFound = true;

Bandingkan hanya menanggapi dengan bilangan bulat yang menunjukkan cuaca yang pertama lebih awal, sama atau lebih baru ...

haqwin
sumber
6

Coba ini sebagai gantinya

if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
  matchFound = true;
}
JaredPar
sumber
1
Hmm, Anda perlu membalik urutan tanggal atau mengambil nilai absolutnya, kecuali tanggal kedaluwarsa sudah lewat.
Konrad Rudolph
3

Bandingkan pengembalian 1, 0, -1 untuk masing-masing lebih besar dari, sama dengan, kurang dari.

Kamu ingin:

    if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) 
    { 
        bool matchFound = true;
    }
Mitch Wheat
sumber
1

Ini akan memberi Anda hasil yang akurat:

if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
    matchFound = true;
Jayant
sumber
Sebenarnya yang terjadi jam adalah misal expryDte adalah 28/4/2011 jika U rite (expiryDate-DateTime.now) itu akan memakan waktu juga (28/4/2011 12:00:00 AM - 26/4/2011 11 : 47:00 AM) & kode di atas mengambil nilai 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM yang tidak memberikan perbedaan yang akurat.
Jayant
1

Membandingkan tidak diperlukan, Hari / TotalDays tidak diperlukan.

Yang kamu butuhkan adalah

if (expireDate < DateTime.Now) {
    // has expired
} else {
    // not expired
}

perhatikan ini akan berhasil jika Anda memutuskan untuk menggunakan menit atau bulan atau bahkan tahun sebagai kriteria kadaluwarsa Anda.

rampok
sumber
1
Bukan jawaban yang bagus karena sekarang Anda juga memperhitungkan jam, menit, dan detik. DateTime.Today akan lebih tepat untuk situasi OP.
JL.
1

Dengan asumsi Anda ingin menetapkan false(jika berlaku) ke matchtime, cara penulisan yang lebih sederhana adalah ..

matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
Mick ajaib
sumber
Operator terner di sini benar-benar redundan karena ((expiryDate - DateTime.Now] .TotalDays <30) sudah mengembalikan boolean.
Fabio
@Fabio Terima kasih sobat menghapus mereka untuk menetapkan nilai Boolean melalui tipe kembali.
Magic Mick
0

Tidak, fungsi Bandingkan akan mengembalikan 1, 0, atau -1. 0 ketika kedua nilai sama, -1 dan 1 berarti kurang dari dan lebih besar dari, saya percaya urutan itu, tetapi saya sering mencampuradukkannya.

Timothy Carter
sumber
0

Tidak, Anda tidak menggunakannya dengan benar.

Lihat di sini untuk detailnya.

DateTime t1 = new DateTime(100);
DateTime t2 = new DateTime(20);

if (DateTime.Compare(t1, t2) >  0) Console.WriteLine("t1 > t2"); 
if (DateTime.Compare(t1, t2) == 0) Console.WriteLine("t1 == t2"); 
if (DateTime.Compare(t1, t2) <  0) Console.WriteLine("t1 < t2");
David Basarab
sumber
0

Yang ingin Anda lakukan adalah mengurangi dua DateTimes (expiryDate dan DateTime.Now). Ini akan mengembalikan objek berjenis TimeSpan. TimeSpan memiliki properti "Days". Bandingkan angka itu dengan 30 untuk jawaban Anda.

GWLlosa
sumber
0

Tidak, itu tidak benar, coba ini:

DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
    matchFound = true;
}
Canavar
sumber
0

Sebenarnya tidak ada dari jawaban ini yang berhasil untuk saya. Saya menyelesaikannya dengan melakukan seperti ini:

  if ((expireDate.Date - DateTime.Now).Days > -30)
  {
    matchFound = true;
  }

Ketika saya mencoba melakukan ini:

matchFound = (expiryDate - DateTime.Now).Days < 30;

Hari ini, 2011-11-14 dan tanggal kadaluwarsa saya adalah 2011-10-17 saya mendapatkan matchFound = -28. Bukannya 28. Jadi saya membalik cek terakhir.

SBergstrom
sumber
0
// this isn't set up for good processing.  
//I don't know what data set has the expiration 
//dates of your accounts.  I assume a list.
// matchfound is a single variablethat returns true if any 1 record is expired.

bool matchFound = false;
            DateTime dateOfExpiration = DateTime.Today.AddDays(-30);
            List<DateTime> accountExpireDates = new List<DateTime>();
            foreach (DateTime date in accountExpireDates)
            {
                if (DateTime.Compare(dateOfExpiration, date) != -1)
                {
                    matchFound = true;
            }
            }
Alex
sumber
1
Bukankah itu agak rumit?
Maks
Di mana penyebutan accountExpireDates dalam pertanyaan? Anda menyalin menempelkan solusi yang buruk. matchFound hampir terdengar seperti Anda mencampur Pola atau RegEx. Btw, Anda harus istirahat ketika kecocokan ditemukan atau terus berputar. Juga bagaimana jika -2? MSDN tidak mengatakan nilai yang mungkin adalah -1, 0 dan 1.
Mukus
0

Anda dapat mencoba melakukan seperti ini:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}
vlad
sumber
6
Harap coba untuk lebih deskriptif dalam penjelasan Anda.
borchvm