2009-02-09 69 views

Trả lời

179

Tôi có sử dụng DateTime So sánh chính xác không?

No. Compare chỉ 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 DateTime s. Kết quả là đối tượng TimeSpan có thuộc tính TotalDays.

Thêm vào đó, có điều kiện có thể được ghi trực tiếp như:

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

Không if cần thiết.

+2

nên được phép cung cấp cho bạn 2+;) một cho câu trả lời và một cho cách ngắn để thể hiện nó – CheGueVerra

+4

Uh ... Tôi chỉ làm câu trả lời của tôi lâu hơn vì vậy cảm thấy tự do để trừ một phiếu bầu tưởng tượng. ;-) –

+1

Vui lòng sử dụng ['TotalDays'] (http://msdn.microsoft.com/en-us/library/system.timespan.totaldays.aspx) thay vì ngày. –

0

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 theo thứ tự đó, nhưng tôi thường trộn chúng lên.

0

Không bạn không sử dụng chính xác.

Xem here để biết chi tiết.

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

Hãy thử điều này thay vì

if ((expiryDate - DateTime.Now).TotalDays < 30) { 
    matchFound = true; 
} 
+1

Hmm, bạn cần phải đảo ngược thứ tự ngày của bạn hoặc lấy giá trị tuyệt đối, trừ khi ngày hết hạn đã trôi qua. –

+0

@Konrad, vâng, tôi đã đọc sai câu hỏi. Đã sửa lỗi – JaredPar

0

Những gì bạn muốn làm là trừ hai DateTimes (expiryDate và DateTime.Now). Điều này sẽ trả về một đối tượng kiểu TimeSpan. TimeSpan có thuộc tính "Days". So sánh số đó với 30 cho câu trả lời của bạn.

0

Không nó không đúng, hãy thử này:

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

Hãy so sánh lợi nhuận 1, 0, -1 cho lớn hơn, bằng, ít hơn, tương ứng.

Bạn muốn:

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

Vâng, tôi sẽ làm điều đó như thay vì điều này:

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

Hãy so sánh chỉ đáp ứng với một thời tiết chỉ số nguyên đầu tiên là trước đó, tương tự hay muộn ...

12

nên

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

lưu ý tổng số ngày nếu không bạn sẽ nhận được hành vi werid

+0

câu trả lời này đã hơn một năm sau lần chỉnh sửa cuối cùng được chấp nhận! –

+0

@Mitch - Đây là câu trả lời đúng, thông báo rằng anh ấy đang sử dụng TotalDays thay vì Ngày. –

+0

Câu trả lời được chấp nhận là chính xác. TotalDays trả về một phần phân đoạn là tốt, đó là dư thừa khi so sánh với một số nguyên. –

1

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; 
+0

thực sự những gì xảy ra hr là eg.expryDte là 28/4/2011 nếu U nghi thức (expiryDate-DateTime.bây giờ) cũng sẽ mất thời gian (28/4/2011 12:00:00 SA - 26/4/2011 11:47:00 SA) & mã trên có giá trị là 28/4/2011 12:00:00 AM-26/4/2011 12:00:00 SA bị bệnh cho sự khác biệt chính xác. – Jayant

1

Hãy so sánh là không cần thiết, Ngày/Tổng số 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 
} 

ghi chú này sẽ làm việc nếu bạn quyết định sử dụng số phút hoặc vài tháng hoặc thậm chí nhiều năm như tiêu chí hết hạn của bạn.

+0

Không phải là một câu trả lời tuyệt vời bởi vì bây giờ bạn cũng bao thanh toán theo giờ, phút và giây. DateTime.Today sẽ chính xác hơn cho tình huống OP. –

0

Thực tế, 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ư thế này:

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

Khi tôi đã cố gắng làm điều này:

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

Hôm nay, 2011/11/14 và expiryDate tôi là 2011/10/17 tôi đã nhận rằng matchFound = - 28. Thay vì 28. Vì vậy, tôi lật ngược kiểm tra cuối cùng.

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

Đó không phải là một chút phức tạp? – Max

+0

Đâu là đề cập đến accountExpireDates trong câu hỏi? Bạn sao chép dán một giải pháp xấu. matchFound gần giống như bạn đang trộn Pattern hoặc RegEx. Btw, bạn cần phải phá vỡ khi một trận đấu được tìm thấy hoặc nó tiếp tục lặp lại. Còn nếu đó là -2? MSDN không nói các giá trị có thể là -1, 0 và 1. – Mukus

0

Giả sử bạn muốn gán false (nếu có) để matchtime, một cách đơn giản của văn bản nó sẽ là ..

matchtime = ((expiryDate - DateTime.Now).TotalDays < 30) ? true : false; 
Các vấn đề liên quan