2009-10-21 15 views
82

¿Existe una forma mejor de .net para verificar si ha ocurrido un DateTime "hoy" y luego el siguiente código?¿Cómo verificar si un DateTime ocurre hoy?

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

+0

D'oh, por supuesto! :) Gracias –

Respuesta

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

} 
else 
{ 

} 

debe 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

+0

@stevemegson +1 :) –

13

Trate

if (newsStory.Date == DateTime.Now.Date) 
{ /* Story happened today */ } 
else 
{ /* Story didn't happen today */ } 
+0

@Lucero - gracias por ordenar el formato :) :) –

25
if(newsStory.Date == DateTime.Today) 
{ 
    // happened today 
} 
+4

Me gustaría agregar, es un error muy común (y difícil de detectar) - simplemente comparando el DateTime con un DateTime.Today. –

2

Como Guillame sugirió in a comment, comparar los valores de propiedades: Date

newStory.Date == DateTime.Now.Date 
7

Si NewsStory estaba usando un DateTime también, simplemente comparar la propiedad de fecha, y ya está.

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

+0

+1 para una respuesta más completa – JustLoren

-5

podría utilizar 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 el 21/10/2008, volverá a ser cierto (no tuve en cuenta los años bisiestos aquí). –

+2

Esto no discriminará entre los años new DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear; –

+0

Estás en lo correcto. Eché de menos eso. –

2

Prueba esto:

newsStory.Date == DateTime.Today 
-3

¿Qué tal

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

Pero esto también puede devolver verdadero para el 1 de enero de 2008 y 1 ª enero de 2009, la cual puede o no ser lo que quieres

1

bien, DateTime tiene una propiedad "Fecha" y usted podría simplemente comparar en función de eso. Pero al mirar los documentos parece que obtener esa propiedad crea una nueva fecha y hora con el componente de hora configurado a medianoche, por lo que puede ser más lento que acceder a cada componente individual, aunque mucho más limpio y legible.

+0

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

+0

Estoy de acuerdo: en estos días, me resulta cada vez más difícil sacudir la optimización prematura, ya que el mundo de la codificación moderna se trata más de legibilidad y mantenimiento. ¡Los viejos hábitos tardan en morir! –

4

FYI,

newsStory.Date == DateTime.Today

devolverá el mismo resultado que compara la codificación

newsStory == DateTime.Today

donde newsStory es un objeto DateTime

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

+0

Dato interesante, gracias –

11

Mi solución:

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

se puede implementar un método de extensión DateTime.

Crear 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, por todas partes en su código, ¿dónde quieres llevar a cabo esta prueba, debe incluir el uso de:

using ExtensionMethods; 

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

newsStory.WhenAdded.IsSameDay(DateTime.Now); 
+3

¿por qué no solo devuelve datetime1.Date == datetime2.Date? –

+0

@SergiuMindras tiene razón, es suficiente comparar ambos 'Fecha' ya que' TimeSpan' siempre será 00:00:00. – GoRoS

Cuestiones relacionadas