Как проверить, наступает ли DateTime сегодня?

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

Ответы:

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

}
else
{

}

Должен сделать свое дело.

пирокумулус
источник
3
... если newsStory.Date - это на самом деле только часть даты без времени. ;)
Lucero
14
... что это такое, если newsStory - это DateTime
стивемегсон,
18
ну, DateTime является частью библиотеки классов .NET Framework, поэтому, хотя возможно, что OP создал свой собственный класс с тем же именем, вы должны задаться вопросом, почему он спрашивает StackOverflow, как использовать настраиваемый класс он создал и ожидает, что мы волшебным образом узнаем, как это работает. ;)
Брайан Шрот
2
@Lucero, это возможно, однако в заголовке вопроса написано «два DateTimes». ;) Думаю, отсюда мы и взяли недостающий тип.
Pyrocumulus
1
@HansPetterNaumann, это логично :) DateTime.AddHours () возвращает новый объект DateTime, тем самым эффективно отменяя вашу операцию .Today, в которой действительно не было компонента времени.
Pyrocumulus
29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}
Дэйв Д.
источник
5
Я хотел бы добавить, это очень распространенная (и трудно обнаруживаемая ошибка) - просто сравнение DateTime с DateTime.Today.
JL.
16

Пытаться

if (newsStory.Date == DateTime.Now.Date) 
{ /* Story happened today */ }
else
{ /* Story didn't happen today */ }
Стивен Ньюман
источник
14

Мое решение:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}
А.Полежаев
источник
7

Если NewsStory также использовала DateTime, просто сравните свойство Date, и все готово.

Однако это зависит от того, что на самом деле означает «сегодня». Если что-то будет опубликовано незадолго до полуночи, через короткое время оно станет «старым». Так что, возможно, было бы лучше сохранить точную дату истории (включая время, предпочтительно UTC) и проверить, прошло ли менее 24 часов (или чего-то еще), что просто (даты можно вычесть, что дает вам TimeSpan с TotalHours или свойство TotalDays).

Lucero
источник
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:

using ExtensionMethods;

А затем используйте метод расширения:

newsStory.WhenAdded.IsSameDay(DateTime.Now);
Бенджамим
источник
3
почему бы просто не вернуть datetime1.Date == datetime2.Date?
Серджиу Миндрас
@SergiuMindras прав, достаточно сравнить оба Date, так как TimeSpanвсегда будет 00:00:00.
GoRoS
5

FYI,

newsStory.Date == DateTime.Today

вернет тот же результат сравнения, что и кодирование

newsStory == DateTime.Today

где newsStoryявляется DateTimeобъектом

.NET достаточно умен, чтобы определить, что вы хотите сравнивать, только на основе даты и использует это для внутреннего сравнения. Не уверен, почему, и на самом деле возникают проблемы с поиском документации для этого поведения.

гадить
источник
2

Попробуй это:

newsStory.Date == DateTime.Today
Филип Уоллес
источник
1

ну, у DateTime есть свойство Date, и вы можете просто сравнивать на его основе. Но, глядя на документы, кажется, что получение этого свойства фактически создает новый экземпляр datetime с компонентом времени, установленным на полночь, поэтому он вполне может быть медленнее, чем доступ к каждому отдельному компоненту, хотя намного чище и удобочитаемее.

Брайан Шрот
источник
Я думаю, что замедление (если оно есть) будет настолько небольшим, что почти во всех случаях это не имеет значения. Конечно же случай преждевременной оптимизации.
Эсбен Сков Педерсен,
Согласен - в наши дни мне все труднее отказываться от преждевременной оптимизации, поскольку современный мир программирования больше ориентирован на удобочитаемость и ремонтопригодность. Старые привычки умирают с трудом!
Питер Бриджер,
0

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

Сасан Салем
источник
-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 - вернется true (високосные годы здесь я не учел).
Филип Уоллес,
2
Это не будет различать годы. New DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D