Nuestros usos de aplicación JodaTime al tiempo de manejo, y (por razones de API formateo) almacenamos veces en una clase de modelo que se parece un poco como esto:
class Event {
private LocalDateTime localTime;
private DateTimeZone timeZone;
public DateTime getTime() {
return localStopTime.toDateTime(timeZone);
}
public void setTime(DateTime value) {
this.localTime = value.toLocalDateTime();
this.timeZone = value.getZone();
}
// ...more boilerplate
}
Además me di cuenta corriente abajo nos iban a dar una hora diferente fuera que estábamos preparando. Supuse que estábamos convirtiendo los campos de nuevo a un mal DateTime, ya que los campos locales parecen tener los valores correctos.
En un capricho He intentado cambiar el captador y ahora funciona, pero no tengo ni idea de por qué:
public DateTime getTime() {
return localStopTime.toDateTime().withZone(timeZone);
}
La documentación joda es un poco hermético sobre cómo se lleva a cabo la toDateTime()
llamada; Dice que "usos" una cierta zona horaria de alguna manera, pero eso es todo.
¿Puede alguien me explique cuál es la diferencia entre
return localStopTime.toDateTime(timeZone);
y
return localStopTime.toDateTime().withZone(timeZone);
?
¡Gracias por adelantado!
Editar: He lo descubrió - yo estaba usando "Etc / GMT" como mi zona horaria y que no tuvo en cuenta el ahorro de luz diurna. Han marcado la respuesta de Marco como correcta
La diferencia entre los dos es la siguiente, se utiliza withZone()
para: (a JavaDocs dice)
Devuelve una copia de esta fecha y hora con una zona horaria diferente, conservando el instante milisegundo.
Además, el JavaDocs ofrece un buen ejemplo:
Este método es útil para encontrar la hora local en otra zona horaria. Por ejemplo, si en este instante sostiene 12:30 en Europa / Londres, el resultado de este método con Europa / París sería 13:30.
Y se utiliza el toDateTime(timeZone)
para regresar un DateTime
objeto, sino la aplicación de los especificados timeZone
a ella.
Por lo tanto, se puede utilizar toDateTime(timeZone).withZone(secondTimeZone)
y obtendrá una copia de la DateTime
generada por la primera instrucción ( toDateTime(timeZone)
) pero, con una zona horaria diferente, perseving el instante milisegundo. Y si se utiliza toDateTime()
sin parámetros, sólo se va a recuperar un DateTime
objeto.