Tôi đang cố gắng tìm hiểu xem tài khoản có hết hạn trong vòng chưa đầy 30 ngày hay không. Tôi có đang sử dụng DateTime Compare đúng không?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Tôi đang cố gắng tìm hiểu xem tài khoản có hết hạn trong vòng chưa đầy 30 ngày hay không. Tôi có đang sử dụng DateTime Compare đúng không?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Câu trả lời:
Tôi có đang sử dụng DateTime Compare đúng không?
Không. CompareChỉ cung cấp thông tin về vị trí tương đối của hai ngày: ít hơn, bằng hoặc lớn hơn. Những gì bạn muốn là một cái gì đó như thế này:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
Điều này trừ hai DateTimes. Kết quả là một TimeSpanđối tượng có một thuộc TotalDaystính.
Ngoài ra, điều kiện có thể được viết trực tiếp như sau:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Không ifcần thiết.
TotalDaysthay vì ngày.
Dayslà thành phần lớn nhất của TimeSpan. Những người đọc điều này có thể ngoại suy điều đó để nghĩ rằng thuộc Secondstính hoạt động theo cùng một cách.
Daysbản thân nó cũng có thể sai. Daysvà TotalDaysgiống nhau ở đây chỉ vì điều kiện là < 30, nhưng sẽ có một sự khác biệt rõ ràng nếu nó là <= 30, vì TotalDayscó thể trả về một cái gì đó giống như 30.421trong khi Daysvẫn trả về 30.
nên là
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
lưu ý tổng số ngày nếu không bạn sẽ có hành vi mệt mỏi
TotalDayslà trường chính xác về mặt khái niệm để sử dụng. Trong thực tế, chúng cho cùng một kết quả nhưng chỉ vì Dayslà thành phần lớn nhất TimeSpan, nếu có thành phần Tháng hoặc Năm và đây sẽ là một câu chuyện khác. Chỉ cần cố gắng với Hours, Secondshoặc Millisecondsđể xem cách họ làm việc.
Hãy thử cái này thay thế
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
So sánh trả về 1, 0, -1 cho lớn hơn, bằng, nhỏ hơn, tương ứng.
Bạn muốn:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
Điều này sẽ cung cấp cho bạn kết quả chính xác:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
So sánh là không cần thiết, Ngày / Tổng ngày là không cần thiết.
Tất cả bạn cần là
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
lưu ý rằng điều này sẽ hiệu quả nếu bạn quyết định sử dụng phút hoặc tháng hoặc thậm chí năm làm tiêu chí hết hạn của mình.
Giả sử bạn muốn gán false(nếu có) matchtime, cách viết đơn giản hơn sẽ là ..
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
Không, hàm So sánh sẽ trả về 1, 0 hoặc -1. 0 khi hai giá trị bằng nhau, -1 và 1 có nghĩa là nhỏ hơn và lớn hơn, tôi tin vào thứ tự đó, nhưng tôi thường trộn chúng với nhau.
Không, bạn đang sử dụng nó không đúng cách.
Xem chi tiết tại đây .
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");
Thực ra không có câu trả lời nào trong số này phù hợp với tôi. Tôi đã giải quyết nó bằng cách làm như sau:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
Khi tôi thử làm điều này:
matchFound = (expiryDate - DateTime.Now).Days < 30;
Hôm nay, ngày 11 tháng 11 năm 2011 và ngày hết hạn của tôi là 2011 tháng 10 năm 17, tôi đã nhận được matchFound = -28. Thay vì 28. Vì vậy, tôi đã đảo ngược lần kiểm tra cuối cùng.
// 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;
}
}