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

14
Puede comparar newStory.Date == DateTime.Now.Date
Guillaume

Respuestas:


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

}
else
{

}

Debería hacer el truco.


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
}

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 */ }

14

Mi solución:

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

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).


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

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.




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.


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


-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.


-6

podrías usar DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.