DateTime.Compare bir tarihin 30 günden daha eski olup olmadığını nasıl kontrol edebilirim?


86

Bir hesabın süresinin 30 günden daha kısa sürede dolup dolmadığını anlamaya çalışıyorum. DateTime Compare'i doğru kullanıyor muyum?

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

{
     matchFound = true;
}

Yanıtlar:


234

DateTime Compare'i doğru kullanıyor muyum?

Hayır. CompareYalnızca iki tarihin göreceli konumu hakkında bilgi verir: daha az, eşit veya daha büyük. İstediğin şey şuna benzer:

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

Bu, iki DateTimes çıkarır . Sonuç, TimeSpanbir TotalDaysözelliği olan bir nesnedir .

Ek olarak, koşul doğrudan şu şekilde yazılabilir:

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

Gerek yok if.


2
Size 2+ vermesine izin verilmelidir;) biri cevap için ve diğeri de bunu ifade etmenin kısa yolu için
CheGueVerra

4
Uh… Cevabımı daha uzun süre verdim, bu yüzden hayali bir oy çıkarmaktan çekinmeyin. ;-)
Konrad Rudolph

1
Lütfen TotalDaysgünler yerine kullanın .
João Portela

2
Kavramsal olarak daha doğrudur. Hiç fark etmez çünkü Daysen büyük bileşenidir TimeSpan. Bunu okuyan insanlar, Secondsmülkün aynı şekilde çalıştığını düşünerek bunu tahmin edebilirler .
João Portela

2
João Portela'nın yaptığı noktaya ek olarak, Dayskendisi bile yanlış olabilir. Daysve TotalDaysdurumdur çünkü sadece burada aynıdır < 30, ama eğer bariz bir fark olacağını <= 30, çünkü TotalDaysgibi mayıs döner şey 30.421ise Dayshala getiriler 30.
Racil Hilan

15

olmalı

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

toplam günleri not edin, aksi takdirde daha akıllıca davranırsınız


bu yanıt, yanıtın kabul edilmesi için yapılan son düzenlemeden bir yıldan fazladır!
Mitch Wheat

@Mitch - Bu doğru cevap, Gün yerine TotalDays kullandığına dikkat edin.
Marcelo Mason

Kabul edilen cevap doğrudur. TotalDays, bir tamsayı ile karşılaştırıldığında gereksiz olan kesirli bir bölümü de döndürür.
Mitch Wheat

1
@MitchWheat TotalDaysolduğu kavramsal olarak kullanımına doğru alan. Uygulamada aynı sonucu veriyorlar, ancak Daysbunun en büyük bileşeni olduğu için TimeSpan, Aylar veya Yıllar bileşeni olsaydı ve bu farklı bir hikaye olurdu. Sadece deneyin Hours, Secondsya Millisecondsda nasıl çalıştığını görmek için.
João Portela

7

Onun yerine bunu şöyle yapardım:

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

Yalnızca ilkinin hava durumunu önceki, aynı veya sonraki olduğunu gösteren bir tam sayı ile yanıtları karşılaştırın ...


6

Onun yerine bunu dene

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

1
Hmm, son kullanma tarihi geçmemişse ya tarihlerinizin sırasını ters çevirmeniz ya da mutlak değeri almanız gerekir.
Konrad Rudolph

3

Sırasıyla büyüktür, eşittir, küçüktür için 1, 0, -1 döndürmelerini karşılaştırın.

İstediğiniz:

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

1

Bu size doğru sonuç verecektir:

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

gerçekte ne olur hr, örn. expryDte 28/4/2011 ise eğer U rite (expiryDate-DateTime.now) zamanı da alacak (28/4/2011 12:00:00 AM - 26/4/2011 11 : 47: 00 AM) ve yukarıdaki kod 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM olarak değer alır ve bu doğru fark verir.
Jayant

1

Karşılaştırma gereksizdir, Günler / Toplam Günler gereksizdir.

Tum ihtiyacin olan sey

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

Son kullanma kriteriniz olarak dakikalar veya aylar hatta yılları kullanmaya karar verirseniz bunun işe yarayacağını unutmayın.


1
Harika bir cevap değil çünkü artık saat, dakika ve saniye de hesaba katıyorsunuz. DateTime.Today, OP'lerin durumu için daha doğru olacaktır.
JL.

1

Atamak istediğinizi varsayarsak false(varsa) matchtime, bunu yazmanın daha basit bir yolu ...

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

Buradaki üçlü operatör tamamen gereksizdir çünkü ((expiryDate - DateTime.Now) .TotalDays <30) zaten bir boole döndürür.
Fabio

@Fabio Teşekkürler dostum, dönüş türü aracılığıyla Boole değerini atamak için onları kaldırdı.
Sihirli Mick

0

Hayır, Karşılaştır işlevi 1, 0 veya -1 döndürür. 0, iki değer eşit olduğunda, -1 ve 1, daha küçük ve daha büyük olduğunda, bu sıraya inanıyorum, ancak genellikle onları karıştırıyorum.


0

Hayır, doğru kullanmıyorsunuz.

Ayrıntılar için buraya bakın.

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

Yapmak istediğiniz şey, iki Tarih Saatini (expiryDate ve DateTime.Now) çıkarmaktır. Bu, TimeSpan türünde bir nesne döndürür. TimeSpan, "Günler" özelliğine sahiptir. Cevabınız için bu sayıyı 30 ile karşılaştırın.


0

Hayır, doğru değil, şunu dene:

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

0

Aslında bu cevapların hiçbiri benim için işe yaramadı. Bunu şu şekilde yaparak çözdüm:

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

Bunu yapmayı denediğimde:

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

Bugün, 2011-11-14 ve son kullanma tarihim 2011-10-17 idi, bu matchFound = -28'i aldım. 28 yerine. Bu yüzden son çeki tersine çevirdim.


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
Bu biraz karmaşık değil mi?
Maksimum

Soruda accountExpireDates ifadesi nerede geçiyor? Kopyaladınız kötü bir çözüm. matchFound, neredeyse Pattern veya RegEx'i karıştırıyormuşsunuz gibi geliyor. Btw, bir eşleşme bulunduğunda veya döngü devam ettiğinde kırmanız gerekir. Ya -2 ise? MSDN, olası değerlerin -1, 0 ve 1 olduğunu
söylemez

0

Bunu yapmayı deneyebilirsiniz:

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

6
Lütfen açıklamanızda daha açıklayıcı olmaya çalışın.
borchvm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.