Joda-Time
En cuanto a la adición de una dependencia, me temo que el java.util.Date & .calendar realmente son tan malos que el primero que hago a cualquier proyecto nuevo es agregar la biblioteca Joda-Time. En Java 8 puedes usar el nuevo paquete java.time, inspirado en Joda-Time.
El núcleo de Joda-Time es la clase DateTime
. A diferencia de java.util.Date, entiende su zona horaria asignada (DateTimeZone
). Al convertir desde j.u.Date, asigne una zona.
DateTimeZone zone = DateTimeZone.forID("America/Montreal");
DateTime dateTimeQuébec = new DateTime(date , zone);
LocalDate
Una forma de verificar si dos pares fecha-hora de la tierra en la misma fecha es la de convertir a LocalDate
objetos.
Esa conversión depende de la zona horaria asignada. Para comparar objetos LocalDate
, deben haberse convertido con la misma zona.
Aquí hay un pequeño método de utilidad.
static public Boolean sameDate (DateTime dt1 , DateTime dt2)
{
LocalDate ld1 = new LocalDate(dt1);
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate(dt2.withZone(dt1.getZone()));
Boolean match = ld1.equals(ld2);
return match;
}
Mejor sería otro argumento, que especifica la zona horaria en lugar de asumir zona horaria del primer objeto DateTime se debe utilizar.
static public Boolean sameDate (DateTimeZone zone , DateTime dt1 , DateTime dt2)
{
LocalDate ld1 = new LocalDate(dt1.withZone(zone));
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate(dt2.withZone(zone));
return ld1.equals(ld2);
}
Cadena Representación
Otro enfoque es crear una cadena que representa la parte de fecha de cada fecha y hora, y luego comparar cadenas.
Nuevamente, la zona horaria asignada es crucial.
DateTimeFormatter formatter = ISODateTimeFormat.date(); // Static method.
String s1 = formatter.print(dateTime1);
String s2 = formatter.print(dateTime2.withZone(dt1.getZone()) );
Boolean match = s1.equals(s2);
return match;
espacio de tiempo
La solución generalizada es definir un espacio de tiempo, a continuación, preguntar si el lapso contiene su objetivo. Este código de ejemplo está en Joda-Time 2.4. Tenga en cuenta que las clases relacionadas con "medianoche" están en desuso. En su lugar, use el método withTimeAtStartOfDay
. Joda-Time ofrece tres clases para representar un lapso de tiempo de varias maneras: intervalo, período y duración.
Usando el enfoque "Medio abierto" donde el inicio del tramo es inclusivo y el final exclusivo.
La zona horaria del destino puede ser diferente a la zona horaria del intervalo.
DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris");
DateTime target = new DateTime(2012, 3, 4, 5, 6, 7, timeZone);
DateTime start = DateTime.now(timeZone).withTimeAtStartOfDay();
DateTime stop = start.plusDays(1).withTimeAtStartOfDay();
Interval interval = new Interval(start, stop);
boolean containsTarget = interval.contains(target);
java.time
Java 8 y posterior viene con el marco java.time. Inspirado por Joda-Time, definido por JSR 310, y extendido por el proyecto ThreeTen-Extra. Ver Tutorial.
Los fabricantes de Joda-Time nos han indicado a todos que pasen a java.time tan pronto como sea conveniente. Mientras tanto, Joda-Time continúa como un proyecto activamente mantenido. Pero espere que el trabajo futuro ocurra solo en java.time y ThreeTen-Extra en lugar de Joda-Time.
Para resumir java.time en pocas palabras ... Un Instant
es un momento en la línea de tiempo en UTC. Aplique una zona horaria (ZoneId
) para obtener un objeto ZonedDateTime
. Para salir de la línea de tiempo, para obtener la vaga idea indefinida de una fecha y hora, use las clases "locales": LocalDateTime
, LocalDate
, LocalTime
.
La lógica discutida en la sección Joda-Time de esta respuesta se aplica a java.time.
La antigua clase java.util.Date tiene un nuevo método toInstant
para la conversión a java.time.
Instant instant = yourJavaUtilDate.toInstant(); // Convert into java.time type.
La determinación de una fecha requiere una zona horaria.
ZoneId zoneId = ZoneId.of("America/Montreal");
Aplicamos ese objeto de zona horaria a la Instant
para obtener un ZonedDateTime
. De eso extraemos un valor solo de fecha (a LocalDate
) ya que nuestro objetivo es comparar fechas (no horas, minutos, etc.).
ZonedDateTime zdt1 = ZonedDateTime.ofInstant(instant , zoneId);
LocalDate localDate1 = LocalDate.from(zdt1);
hacer lo mismo con la segunda java.util.Date
objeto que necesitamos para la comparación. Usaré el momento actual en su lugar.
ZonedDateTime zdt2 = ZonedDateTime.now(zoneId);
LocalDate localDate2 = LocalDate.from(zdt2);
utilizan el método especial isEqual
para poner a prueba para el mismo valor de fecha.
Boolean sameDate = localDate1.isEqual(localDate2);
sólo para aclarar - quieres saber si dos objetos Date caen en el mismo día de la semana? –
¿Desea comparar la fecha completa (día, mes, año) o solo el día del mes? – XpiritO
@Rob: no, el mismo día/mes/año ... Lo aclararé. –