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;
}
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;
}
Jawaban:
Apakah saya menggunakan Perbandingan DateTime dengan benar?
Tidak. Compare
Hanya 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 DateTime
s. Hasilnya adalah TimeSpan
objek yang memiliki TotalDays
properti.
Selain itu, kondisional dapat ditulis langsung sebagai:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Tidak if
perlu.
TotalDays
sebagai pengganti hari.
Days
merupakan komponen terbesar TimeSpan
. Orang yang membaca ini dapat memperkirakan hal itu dengan berpikir bahwa Seconds
properti tersebut bekerja dengan cara yang sama.
Days
dirinya sendiri juga bisa salah. Days
dan TotalDays
sama di sini hanya karena kondisinya < 30
, tetapi akan ada perbedaan yang jelas jika dulu <= 30
, karena TotalDays
mungkin mengembalikan sesuatu seperti 30.421
saat Days
masih kembali 30
.
seharusnya
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
catat total hari jika tidak, Anda akan mendapatkan perilaku werid
TotalDays
secara konseptual adalah bidang yang benar untuk digunakan. Pada prakteknya mereka memberikan hasil yang sama tetapi hanya karena Days
merupakan komponen terbesar TimeSpan
, seandainya ada komponen Bulan atau Tahun dan ini akan menjadi cerita yang berbeda. Coba saja Hours
, Seconds
atau Milliseconds
lihat cara kerjanya.
Coba ini sebagai gantinya
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
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;
}
Ini akan memberi Anda hasil yang akurat:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
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.
Dengan asumsi Anda ingin menetapkan false
(jika berlaku) ke matchtime
, cara penulisan yang lebih sederhana adalah ..
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
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.
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");
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.
// 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;
}
}