¿Cómo comprobar si se produce una fecha y hora hoy?

110

¿Existe una mejor manera .net de verificar si se ha producido una fecha y hora 'hoy' que el código a continuación?

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
fuente
14
Puede comparar newStory.Date == DateTime.Now.Date
Guillaume

Respuestas:

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

}
else
{

}

Debería hacer el truco.

pirocumulus
fuente
3
... si newsStory.Date es en realidad solo la parte de la fecha, sin tiempo. ;)
Lucero
14
... que es, si newsStory es un DateTime
stevemegson
18
bueno, DateTime es parte de la biblioteca de clases de .NET Framework, por lo que si bien es posible que el OP haya creado su propia clase que comparte el mismo nombre, tendría que preguntarse por qué le preguntaría a StackOverflow cómo usar una clase personalizada creó y espera que sepamos mágicamente cómo funcionó. ;)
Brian Schroth
2
@Lucero eso es posible, sin embargo, el título de la pregunta dice 'dos ​​DateTimes'. ;) Supongo que de ahí es de donde sacamos ese tipo que falta.
pirocumulus
1
@HansPetterNaumann eso es lógico :) DateTime.AddHours () devuelve un nuevo objeto DateTime, cancelando así efectivamente su operación .Today que de hecho no tenía un componente de hora.
pirocumulus
29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}
Dave D
fuente
5
Me gustaría agregar que es un error muy común (y difícil de detectar), simplemente comparando DateTime con DateTime.Today.
JL.
16

Tratar

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

Mi solución:

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

Si NewsStory también estaba usando un DateTime, simplemente compare la propiedad Date y listo.

Sin embargo, esto depende de lo que realmente signifique "hoy". Si algo se publica poco antes de la medianoche, será "antiguo" después de poco tiempo. Entonces, tal vez sería mejor mantener la fecha exacta de la historia (incluida la hora, preferiblemente UTC) y verificar si han pasado menos de 24 horas (o lo que sea), lo cual es simple (las fechas se pueden restar, lo que le da un TimeSpan con un TotalHours o propiedad TotalDays).

Lucero
fuente
5

Puede implementar un método de extensión DateTime.

Cree una nueva clase para sus métodos de extensión:

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

Y ahora, en todas partes de su código, dónde desea realizar esta prueba, debe incluir el uso:

using ExtensionMethods;

Y luego, usa el método de extensión:

newsStory.WhenAdded.IsSameDay(DateTime.Now);
Benjamim
fuente
3
¿Por qué no devolver datetime1.Date == datetime2.Date?
Sergiu Mindras
@SergiuMindras tiene razón, basta con comparar ambos Dateya que TimeSpansiempre serán las 00:00:00.
GoRoS
5

FYI,

newsStory.Date == DateTime.Today

devolverá el mismo resultado de comparación que la codificación

newsStory == DateTime.Today

donde newsStoryesta un DateTimeobjeto

.NET es lo suficientemente inteligente como para determinar que desea comparar basándose solo en la fecha y lo usa para la comparación interna. No estoy seguro de por qué, y realmente tengo problemas para encontrar documentación para este comportamiento.

guck
fuente
2

Prueba esto:

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

bueno, DateTime tiene una propiedad "Date" y puedes comparar basándote en eso. Pero al mirar los documentos, parece que obtener esa propiedad en realidad instancia una nueva fecha y hora con el componente de hora configurado en medianoche, por lo que puede ser más lento que acceder a cada componente individual, aunque mucho más limpio y legible.

Brian Schroth
fuente
Creo que una desaceleración (si existe) será tan pequeña que no importa en casi todos los casos. Sin duda, un caso de optimización prematura.
Esben Skov Pedersen
De acuerdo, en estos días encuentro que es cada vez más difícil deshacerse de la optimización prematura ya que el mundo de la codificación moderno se trata más de legibilidad y mantenibilidad. ¡Los viejos hábitos tardan en morir!
Peter Bridger
0

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

Sasan Salem
fuente
-4

Qué tal si

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

Pero esto también será válido para el 1 de enero de 2008 y el 1 de enero de 2009, que puede ser o no lo que usted desea.

Polyfun
fuente
-6

podrías usar DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }
Ryan Alford
fuente
1
No creo que esto funcione. Si hoy es 21/10/2009 y newsStory es 21/10/2008, volverá a ser verdadero (no tomé en cuenta los años bisiestos aquí).
Philip Wallace
2
Esto no discriminará entre años new DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D