DateTime.C So sánh cách kiểm tra xem một ngày có ít hơn 30 ngày hay không?


86

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:


232

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.


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 con đường ngắn để thể hiện nó
CheGueVerra

4
Uh… Tôi vừa làm cho câu trả lời của mình dài hơn nên cứ trừ một phiếu tưởng tượng. ;-)
Konrad Rudolph

1
Vui lòng sử dụng TotalDaysthay vì ngày.
João Portela

2
Nó chính xác hơn về mặt khái niệm. Nó không tạo ra sự khác biệt vì 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.
João Portela

2
Thêm vào điểm João Portela đã đưa ra, ngay cả Daysbản thân nó cũng có thể sai. DaysTotalDaysgiố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.
Racil Hilan

15

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


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

@Mitch - Đây là câu trả lời chính xác, lưu ý rằng anh ấy đang sử dụng TotalDays chứ không phải Days.
Marcelo Mason,

Câu trả lời được chấp nhận là đúng. TotalDays cũng trả về một phần phân số, phần này là dư thừa khi so sánh với một số nguyên.
Mitch Wheat

1
@MitchWheat 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.
João Portela

7

Tôi sẽ làm như thế này thay vì:

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

So sánh chỉ phản hồi với một số nguyên cho biết thời tiết đầu tiên là sớm hơn, giống nhau hoặc muộn hơn ...


6

Hãy thử cái này thay thế

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

1
Rất tiếc, bạn cần phải đảo ngược thứ tự các ngày của mình hoặc lấy giá trị tuyệt đối, trừ khi ngày hết hạn đã qua.
Konrad Rudolph

3

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

1

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

thực sự những gì xảy ra giờ là ví dụ .expryDte là 28/4/2011 nếu U nghi thức (Hạn sử dụng- Ngày- Thời gian.now) thì cũng sẽ mất thời gian (28/4/2011 12:00:00 AM - 26/4/2011 11 : 47: 00 AM) & mã trên có giá trị là 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM, không cho sự khác biệt chính xác.
Jayant

1

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.


1
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 đang tính theo giờ, phút và giây. DateTime.Today sẽ đúng hơn cho tình huống OPs.
JL.

1

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

Toán tử bậc ba ở đây là hoàn toàn dư thừa vì ((Ngày hết hạn - DateTime.Now) .TotalDays <30) đã trả về một boolean.
Fabio

@Fabio Cảm ơn bạn đã xóa chúng để gán giá trị Boolean thông qua kiểu trả về.
Magic Mick

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 vào thứ tự đó, nhưng tôi thường trộn chúng với nhau.


0

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

0

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


0

Không, nó không chính xác, hãy thử điều này:

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

0

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.


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?
Tối đa

Đề cập đến accountExpireDates trong câu hỏi ở đâu? Bạn sao chép đã dán một giải pháp không tốt. 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. Ngoài ra nếu nó là -2 thì sao? MSDN không nói các giá trị có thể là -1, 0 và 1.
Mukus

0

Bạn có thể thử làm như sau:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}

6
Vui lòng cố gắng mô tả nhiều hơn trong phần giải thích của bạn.
borchvm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.