Bugün bir DateTime olup olmadığını nasıl kontrol edebilirim?


110

Bir DateTime 'bugün' olup olmadığını kontrol etmenin daha iyi bir .net yolu var mı, daha sonra aşağıdaki kod mu?

if ( newsStory.WhenAdded.Day == DateTime.Now.Day &&
     newsStory.WhenAdded.Month == DateTime.Now.Month &&
     newsStory.WhenAdded.Year == DateTime.Now.Year )
{ 
    // Story happened today
}
else
{ 
    // Story didn't happen today
}

14
NewStory.Date == DateTime.Now.Date
Guillaume

Yanıtlar:


222
if (newsStory.WhenAdded.Date == DateTime.Today)
{

}
else
{

}

Hile yapmalı.


3
... newsStory.Date aslında zaman olmadan yalnızca tarih kısmı ise. ;)
Lucero

14
... eğer newsStory bir DateTime ise
stevemegson

18
kuyu, DateTime o yüzden ederken, .NET Framework sınıf kitaplığı bir parçası olan olası o özel bir sınıf nasıl kullanılacağı StackOverflow isteyeceğini neden OP aynı adı paylaşan olur kendi sınıfını yarattı, merak olurdu yarattı ve sihirli bir şekilde nasıl çalıştığını bilmemizi bekliyor. ;)
Brian Schroth

2
@Lucero bu mümkün ancak soru başlığı 'iki DateTimes' yazıyor. ;) Sanırım bu eksik türü nereden aldık.
pyrocumulus

1
@HansPetterNaumann bu mantıklı :) DateTime.AddHours () yeni bir DateTime nesnesi döndürür, böylece gerçekten bir zaman bileşeni olmayan .Today işleminizi etkin bir şekilde iptal eder.
pyrocumulus

29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}

5
Eklemek istiyorum, bu çok yaygın (ve tespit edilmesi zor bir hata) - sadece DateTime'ı DateTime.Today ile karşılaştırmak.
JL.

16

Deneyin

if (newsStory.Date == DateTime.Now.Date) 
{ /* Story happened today */ }
else
{ /* Story didn't happen today */ }

14

Çözümüm:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}

7

NewsStory bir DateTime da kullanıyorsa, sadece Date özelliğini karşılaştırın ve bitirdiniz.

Ancak bu, "bugün" ün gerçekte ne anlama geldiğine bağlıdır. Bir şey gece yarısından kısa bir süre önce yayınlanırsa, kısa bir süre sonra "eski" olur. Öyleyse, belki de tam hikaye tarihini (saat dahil, tercihen UTC dahil) tutmak ve 24 saatten az (veya her neyse) geçip geçmediğini kontrol etmek en iyisidir, ki bu basittir (tarihler çıkarılabilir, bu da size Toplam Saatli bir Zaman Aralığı verir. veya TotalDays özelliği).


5

Bir DateTime uzatma yöntemi uygulayabilirsiniz.

Uzantı yöntemleriniz için yeni sınıf oluşturun:

namespace ExtensionMethods
{
    public static class ExtensionMethods
    {
        public static bool IsSameDay( this DateTime datetime1, DateTime datetime2 )
        {
            return datetime1.Year == datetime2.Year 
                && datetime1.Month == datetime2.Month 
                && datetime1.Day == datetime2.Day;
        }
    }
}

Ve şimdi, kodunuzun her yerinde, bu testi nerede yapmak istiyorsunuz, şunu eklemelisiniz:

using ExtensionMethods;

Ve sonra, uzantı yöntemini kullanın:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
neden sadece datetime1.Date == datetime2.Date döndürmüyorsunuz?
Sergiu Mindras

@SergiuMindras haklı, her iki karşılaştırarak yeter DateÇünkü o 's TimeSpandaima 00:00:00 olacaktır.
GoRoS

5

Bilginize,

newsStory.Date == DateTime.Today

kodlamayla aynı karşılaştırma sonucunu döndürecektir

newsStory == DateTime.Today

burada newsStorya, DateTimenesne

.NET, yalnızca Tarihe göre karşılaştırma yapmak isteyip istemediğinizi belirleyecek kadar akıllıdır ve bunu dahili Karşılaştırma için kullanır. Neden olduğundan emin değilim ve aslında bu davranışa ilişkin belgeleri bulmakta sorun yaşıyorsunuz.




1

Evet, DateTime bir "Date" özelliğine sahiptir ve buna göre karşılaştırma yapabilirsiniz. Ancak belgelere bakıldığında, bu özelliğin alınmasının aslında gece yarısına ayarlanmış zaman bileşeniyle yeni bir tarih saati başlattığı görülüyor, bu nedenle çok daha temiz ve daha okunaklı olmasına rağmen, her bir bileşene erişimden çok daha yavaş olabilir.


Bence bir yavaşlama (eğer varsa) o kadar küçük olacak ki neredeyse her durumda önemli değil. Kesinlikle bir erken optimizasyon durumu.
Esben Skov Pedersen

Kabul edildi - modern kodlama dünyası daha çok okunabilirlik ve sürdürülebilirlikle ilgili olduğu için bu günlerde erken optimizasyonu atlatmanın giderek daha zor olduğunu düşünüyorum. Eski alışkanlıklar zor bırakılır!
Peter Bridger

0

if (newsStory.ToShortDateString() == DateTime.Today.ToShortDateString()) return "Todtay";


-4

Ne dersin

if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
{ // Story happened today
}

Ancak bu, istediğiniz gibi olabilir veya olmayabilir 1 Ocak 2008 ve 1 Ocak 2009 için de geçerli olacaktır.


-6

kullanabilirsin DateTime.Now.DayOfYear

 if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
 { // story happened today

 }
 else
 { // story didn't happen today

 }

1
Bunun işe yarayacağını sanmıyorum. Bugün 10/21/2009 ise ve newsStory 10/21/2008 ise - doğru dönecektir (burada artık yılları hesaba katmadım).
Philip Wallace

2
Bu, yeni DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D
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.