Як перевірити, чи відбувається датаTime сьогодні?


110

Чи є кращий .net спосіб перевірити, чи не відбувся DateTime "сьогодні", а потім код нижче?

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
Гійом

Відповіді:


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

}
else
{

}

Слід зробити трюк.


3
... якщо newsStory.Date насправді лише частина дати, без часу. ;)
Lucero

14
... що це, якщо newsStory - це DateTime
stevemegson

18
добре, DateTime є частиною бібліотеки .NET Framework Class, тому, хоча можливо, що ОП створив власний клас, який має спільне ім'я, вам доведеться задаватися питанням, чому він запитає StackOverflow, як використовувати користувацький клас він створив і очікував, що ми магічно знатимемо, як це працює. ;)
Брайан Шрот

2
@Lucero це можливо, однак заголовок питання звучить "два DateTimes". ;) Я здогадуюсь, звідки у нас цей пропавший тип.
пірокумул

1
@HansPetterNaumann це логічно :) DateTime.AddHours () повертає новий об'єкт DateTime, таким чином ефективно скасовуючи вашу операцію .Today, яка дійсно не мала компонента часу.
пірокумул

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

5
Я хотів би додати, це дуже поширена помилка (і її важко помітити) - просто порівнюючи DateTime з DateTime.Today.
JL.


14

Моє рішення:

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

7

Якщо NewsStory також використовував DateTime, просто порівняйте властивість Date, і ви закінчите.

Однак це залежить від того, що насправді означає "сьогодні". Якщо щось розміщено незадовго до півночі, воно буде "старим" через короткий час. Тож, можливо, було б найкращим зберегти точну дату історії (включаючи час, бажано UTC) та перевірити, чи минуло менше 24 годин (або що завгодно), що просте (дати можна відняти, що дає тобі часовий проміжок з TotalHours або властивість TotalDays).


5

Ви можете реалізувати метод розширення DateTime.

Створіть новий клас для своїх методів розширення:

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

А тепер скрізь у коді, де ви хочете виконати цей тест, слід включити:

using ExtensionMethods;

А потім скористайтеся методом розширення:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
чому б просто не повернути datetime1.Date == datetime2.Date?
Sergiu Mindras

@SergiuMindras має рацію, досить порівняти обидві Date, оскільки це TimeSpanзавжди буде 00:00:00.
GoRoS

5

FYI,

newsStory.Date == DateTime.Today

поверне той самий результат порівняння, що і кодування

newsStory == DateTime.Today

де newsStoryє DateTimeоб'єктом

.NET досить розумний, щоб визначити, що ви хочете порівнювати лише на основі дати та використовує це для внутрішнього Порівняння. Не знаю, чому, і насправді виникають проблеми з пошуку документації для такої поведінки.




1

добре, DateTime має властивість "Date", і ви можете просто порівняти виходячи з цього. Але дивлячись на документи, здається, що отримання цього властивості насправді створює новий час часу з компонентом часу, встановленим на півночі, тому це може бути дуже повільним, ніж доступ до кожного окремого компонента, хоча набагато чистіший і легший для читання.


Я думаю, що уповільнення (якщо воно є) буде таким малим, що це не має значення майже у всіх випадках. Безумовно, випадок передчасної оптимізації.
Есбен Сков Педерсен

Погоджено - в наші дні мені стає все складніше викреслити передчасну оптимізацію, оскільки сучасний світ кодування стосується читабельності та ремонтопридатності. Старі звички важко вмирають!
Пітер Брідгер


-4

Як щодо

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

Але це також повернеться справді для 1 січня 2008 року та 1 січня 2009 року, що може бути, а може і не бути тим, що ви хочете.


-6

ви могли б використовувати DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }

1
Я не думаю, що це спрацює. Якщо сьогодні 21.10.2009, а newsStory - 21.10.2008 - це повернеться правдою (тут я не брав до уваги високосні роки).
Філіп Уоллес

2
Це не призведе до дискримінації між новими роками DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Дейв Д
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.