В чем разница между этими двумя способами создания DateTime из LocalDateTime? - PullRequest
3 голосов
/ 26 марта 2019

Наше приложение использует jodatime для обработки времени, и (по причинам форматирования API) мы храним время в классе модели, который выглядит примерно так:

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
}

Дальше вниз по течению я заметил, что у нас было другое время, чем мы устанавливали. Я подумал, что мы преобразовали поля обратно в DateTime неправильно, так как локальные поля, кажется, имеют правильные значения.

По какой-то причине я попытался изменить геттер, и теперь он работает, но я понятия не имею, почему:

    public DateTime getTime() {
        return localStopTime.toDateTime().withZone(timeZone);
    }

Документация joda немного недоверчива о том, как она выполняет вызов toDateTime(); он говорит, что как-то «использует» определенный часовой пояс, но это все.

Может кто-нибудь объяснить мне, в чем разница между

return localStopTime.toDateTime(timeZone);

и

return localStopTime.toDateTime().withZone(timeZone);

Заранее спасибо!

Редактировать: Я понял это - я использовал «Etc / GMT» в качестве часового пояса, и это не учитывало переход на летнее время. Пометили ответ Марко как правильный

1 Ответ

0 голосов
/ 26 марта 2019

Разница между этими двумя заключается в следующем, вы используете withZone() для: (как говорит JavaDocs )

Возвращает копию этого времени и даты с другим временемзона, сохраняющая миллисекундный момент.

Кроме того, JavaDocs предоставляет хороший пример:

Этот метод полезен для нахождения местного времени в другом часовом поясе.Например, если этот момент удерживается в 12:30 в Европе / Лондоне, результат этого метода для Европы / Парижа будет 13: 30.

И вы используете toDateTime(timeZone), чтобы вернуть DateTime объект, но применяя к нему указанный timeZone.

Итак, вы можете использовать toDateTime(timeZone).withZone(secondTimeZone), и вы получите копию DateTime, сгенерированную первым оператором (toDateTime(timeZone)), но,с другим часовым поясом, пропуская миллисекундный момент.И если вы используете toDateTime() без параметров, будет извлечен только объект DateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...