2011-06-29 21 views

Respuesta

32

yo usaría:

LocalDate today = now.toLocalDate(); 
LocalDate tomorrow = today.plusDays(1); 

DateTime startOfToday = today.toDateTimeAtStartOfDay(now.getZone()); 
DateTime startOfTomorrow = tomorrow.toDateTimeAtStartOfDay(now.getZone()); 

A continuación, compruebe si startOfToday <= time < startOfTomorrow para cualquier momento en particular.

Por supuesto, depende en parte de exactamente lo que se almacena en la base de datos -. Y qué zona horaria está interesado en

+0

Creo que tienes un error tipográfico allí. Utiliza 'today' dos veces para leer el comienzo del día ... – nfechner

+0

@nfechner: Reparado, gracias. –

+0

Tenga en cuenta el uso de "<=" frente a "<" en el código anterior en esta respuesta. Esto se conoce como el enfoque "Medio Abierto", donde el comienzo es * inclusive * mientras que el final es * exclusivo *. Este enfoque es una forma inteligente de definir un lapso de tiempo. Además, la clase ['Interval'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) en Joda-Time se puede usar para rastrear el par de objetos DateTime definido en el código de esta Respuesta. La clase Interval utiliza el enfoque Half-Open cuando realiza comparaciones ('contiene',' traslapo', 'hueco',' 'contigua'). –

0
import org.joda.time.DateTime; 
import org.joda.time.DateTimeMidnight; 

DateTime dateTimeAtStartOfToday = new DateTime(new DateTimeMidnight()); 
DateTime dateTimeAtEndOfToday = new DateTime((new DateTimeMidnight()).plusDays(1)); 
+3

Sugeriría * no * usar 'DateTimeMidnight' ya que * no * siempre es medianoche, debido a cambios en el horario de verano. –

+0

@JonSkeet Nunca he visto que no haya medianoche. No siempre hay 2:00 - 3:00 a.m., pero siempre hay medianoche. ¿O es solo una cosa de los Estados Unidos? –

+2

@Bob: Eso es solo cosa de los EE. UU. El cambio de horario de verano puede ocurrir en cualquier momento, de acuerdo con las reglas locales. Descubrí por el camino difícil. –

0

Esto funciona ...

DateTime dt = new DateTime(); 
DateMidnight dtStartDate = dt.toDateMidnight(); 
DateMidnight dtEndDate = dt.plusDays(1).toDateMidnight(); 
System.out.println(dt + "\n" + dtStartDate + "\n" + dtEndDate); 

... pero por lo como el SQL, tiendo a usar BETWEEN como la cláusula where en lugar de hacer> y < = cosas

+0

Esto lanzará una excepción si una de las dos fechas no contiene una medianoche debido a los cambios de horario de verano. toDateTimeAtStartOfDay es mejor IMO. –

+0

Ya sabes, no puedo reproducir la excepción de la que hablas. En el proceso, trabajar con DateMidnight es mejor que todo lo anterior, ya que tiene un método toInterval() que da cuenta de las transiciones DST con facilidad. Estoy agregando esta solución como una respuesta separada. –

+1

Encuentra una zona horaria que se salta hacia adelante a la medianoche. IIRC, en algún lugar de América del Sur lo hace, como he descubierto por las malas ... –

3

Esto funciona mejor, resulta que DateTime tiene un método llamado toInterval que hace esto exacto (se da cuenta de la medianoche a la medianoche) En mis pruebas, parece no tener ningún problema con las transiciones DST.

DateTime now = new DateTime(); 
DateTime startOfToday = now.toDateMidnight().toInterval().getStart(); 
DateTime endOfToday = now.toDateMidnight().toInterval().getEnd(); 
System.out.println("\n" + now + "\n" + startOfToday + "\n" + endOfToday + "\n"); 

JODA parece estar muy bien pensado.

+5

DateMidnight fue [obsoleta] (http: //www.joda.org/joda-time/apidocs/org/joda/time/DateMidnight.html) debido a los problemas de la medianoche. Se sugiere utilizar el método [withTimeAtStartOfDay] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay()) –

1
if((sinceDate.getDayOfYear() == now.getDayOfYear()) && (sinceDate.year() == now.year())) 
    //yep, do something today; 

funciona para mí.

Cuestiones relacionadas