Правильный способ использования периодов для перехода на летнее время с помощью Joda Time

Я получаю неправильные результаты из-за летнего времени в тот день.

Я использовал,

Calendar todays = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));
todays.set(Calendar.HOUR_OF_DAY, 24);
todays.set(Calendar.MINUTE, 0);
todays.set(Calendar.SECOND, 0);
todays.set(Calendar.MILLISECOND, 0);

Как упомянуто в документе Joda-Time,

Попробуйте добавить 1 день на границе летнего времени. Если для сложения вы используете период, то будет добавлено 23 или 25 часов. Если бы вы создали продолжительность, равную 24 часам, то вы бы в итоге получили неправильный результат.

Я не нашел ни одного примера того, как реализовать такой период с использованием Joda-Time.

Итак, я хочу получить количество часов, содержащихся в каждом дне, динамически довольно жестко, кодируя его с 24 часами, как уже упоминалось.

1 ответ

Решение

Самый простой подход - это использовать что-то вроде:

public int getHoursInDay(LocalDate date, DateTimeZone zone) {
    DateTime start = date.toDateTimeAtStartOfDay(zone);
    DateTime end = date.plusDays(1).toDateTimeAtStartOfDay(zone);
    return new Duration(start, end).getStandardHours();
}

РЕДАКТИРОВАТЬ: Если вы используете версию Joda Time, которая не поддерживает Duration.getStandardHours() Вы могли бы использовать:

public int getHoursInDay(LocalDate date, DateTimeZone zone) {
    DateTime start = date.toDateTimeAtStartOfDay(zone);
    DateTime end = date.plusDays(1).toDateTimeAtStartOfDay(zone);
    long millis = new Duration(start, end).getMillis();
    return (int) (millis / DateTimeConstants.MILLIS_PER_HOUR);
}
Другие вопросы по тегам