Como verificar se um DateTime ocorre hoje?

110

Existe uma maneira melhor .net de verificar se um DateTime ocorreu 'hoje' do que o código abaixo?

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
}
Peter Bridger
fonte
14
Você pode comparar newStory.Date == DateTime.Now.Date
Guillaume,

Respostas:

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

}
else
{

}

Deve fazer o truque.

pirocumulus
fonte
3
... se newsStory.Date for na verdade apenas a parte da data, sem hora. ;)
Lucero,
14
... o que é, se newsStory for DateTime
stevemegson
18
bem, DateTime é uma parte da biblioteca de classes .NET Framework, então, embora seja possível que o OP tenha criado sua própria classe que compartilha o mesmo nome, você deve se perguntar por que ele perguntaria a StackOverflow como usar uma classe personalizada ele criou e espera que saibamos magicamente como funcionava. ;)
Brian Schroth,
2
@Lucero isso é possível, porém o título da pergunta é 'dois DateTimes'. ;) Eu acho que é de onde tiramos esse tipo que falta.
pyrocumulus
1
@HansPetterNaumann isso é lógico :) DateTime.AddHours () retorna um novo objeto DateTime, cancelando assim efetivamente sua operação .Today que de fato não tinha um componente de tempo.
pyrocumulus
29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}
Dave Downs
fonte
5
Eu gostaria de acrescentar, é um bug muito comum (e difícil de detectar) - basta comparar o DateTime com um DateTime.Today.
JL.
16

Experimentar

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

Minha solução:

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

Se NewsStory também estava usando um DateTime, compare a propriedade Date e pronto.

No entanto, isso depende do que "hoje" realmente significa. Se algo for postado pouco antes da meia-noite, ficará "velho" após um curto período. Portanto, talvez seja melhor manter a data exata da história (incluindo a hora, de preferência UTC) e verificar se menos de 24 horas (ou o que for) se passaram, o que é simples (as datas podem ser subtraídas, o que lhe dá um TimeSpan com TotalHours ou propriedade TotalDays).

Lucero
fonte
5

Você pode implementar um método de extensão DateTime.

Crie uma nova classe para seus métodos de extensão:

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

E agora, em todos os lugares do seu código, onde deseja realizar este teste, você deve incluir o uso de:

using ExtensionMethods;

E então, use o método de extensão:

newsStory.WhenAdded.IsSameDay(DateTime.Now);
Benjamim
fonte
3
por que não retornar datetime1.Date == datetime2.Date?
Sergiu Mindras
@SergiuMindras está certo, basta comparar os dois Date, pois TimeSpansempre será 00:00:00.
GoRoS
5

PARA SUA INFORMAÇÃO,

newsStory.Date == DateTime.Today

devolverá o mesmo resultado de comparação da codificação

newsStory == DateTime.Today

onde newsStoryestá um DateTimeobjeto

.NET é inteligente o suficiente para determinar que você deseja comparar com base apenas na data e usa isso para a comparação interna. Não tenho certeza do motivo e, na verdade, estou tendo problemas para encontrar a documentação para esse comportamento.

guck
fonte
4

Como Guillame sugeriu em um comentário , compare os valores das Datepropriedades:

newStory.Date == DateTime.Now.Date
Anton Gogolev
fonte
2

Experimente isto:

newsStory.Date == DateTime.Today
Philip Wallace
fonte
1

bem, DateTime tem uma propriedade "Date" e você pode apenas comparar com base nela. Mas olhando para a documentação, parece que obter essa propriedade na verdade instancia um novo datetime com o componente time definido como meia-noite, então pode muito bem ser mais lento do que acessar cada componente individual, embora muito mais limpo e legível.

Brian Schroth
fonte
Acho que uma desaceleração (se houver) será tão pequena que não importa em quase todos os casos. Certamente um caso de otimização prematura.
Esben Skov Pedersen
Concordo - hoje em dia, acho cada vez mais difícil eliminar a otimização prematura, já que o mundo moderno da codificação é mais sobre legibilidade e manutenção. É difícil morrer velhos hábitos!
Peter Bridger
0

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

Sasan Salem
fonte
-4

E se

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

Mas isso também retornará verdadeiro para 1º de janeiro de 2008 e 1º de janeiro de 2009, que podem ou não ser o que você deseja.

Polyfun
fonte
-6

você poderia usar DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }
Ryan Alford
fonte
1
Eu não acho que isso vai funcionar. Se hoje for 21/10/2009 e newsStory for 21/10/2008 - ela retornará verdadeira (não levei os anos bissextos em consideração aqui).
Philip Wallace,
2
Isso não fará distinção entre os anos new DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave Downs,