Nossos usos aplicação JodaTime aos tempos do punho, e (por razões de formatação API) armazenamos vezes em uma classe de modelo que se parece um pouco como este:
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
}
Além disso, eu jusante notado que iríamos conseguir um tempo diferente para fora do que estavam assentados. Achei que foram converter os campos de volta a uma errada DateTime, desde os campos locais parecem ter os valores corretos.
Por um capricho eu tentei mudar o getter e agora ele funciona, mas eu não tenho idéia porque:
public DateTime getTime() {
return localStopTime.toDateTime().withZone(timeZone);
}
A documentação joda é um pouco de boca fechada sobre como ele realiza a toDateTime()
chamada; ele diz que "usos" um determinado fuso horário de alguma forma, mas é isso.
Alguém pode me explicar o que é a diferença entre
return localStopTime.toDateTime(timeZone);
e
return localStopTime.toDateTime().withZone(timeZone);
?
Desde já, obrigado!
Edit: Eu descobri-lo - eu estava usando "Etc / GMT" como o meu fuso horário e que não levou em conta poupança da luz do dia. Marcaram a resposta de Marco como correta
A diferença entre os dois é o próximo, você usa withZone()
a: (como JavaDocs diz)
Retorna uma cópia desta data e hora com um fuso horário diferente, preservando o instante milissegundo.
Além disso, o JavaDocs fornece um bom exemplo:
Este método é útil para encontrar a hora local em outro fuso horário. Por exemplo, se neste instante detém 12:30 Europe / London, o resultado deste método com a Europa / Paris seria 13h30.
E você usar o toDateTime(timeZone)
para retornar um DateTime
objeto mas aplicando o especificado timeZone
a ele.
Assim, você pode usar toDateTime(timeZone).withZone(secondTimeZone)
e você receberá uma cópia do DateTime
gerado pela primeira declaração ( toDateTime(timeZone)
), mas, com um fuso horário diferente, perseving o instante milisecond. E se você usar toDateTime()
sem parâmetros, só vai recuperar um DateTime
objeto.