Как преобразовать продолжительность в период в Joda?

1

Может кто-нибудь объяснить, почему следующие тесты не удается?

@Test
public void testDuration() {
    Duration duration = Duration.standardDays(1);
    assertTrue(duration.getStandardMinutes() == 1440); //OK
    assertTrue(duration.toPeriod().getMinutes() == 1440); //NOK. result = 0
    assertTrue(new Period(duration.getMillis()).getMinutes() == 1400); //NOK. result = 0
}
Теги:
jodatime

2 ответа

2
Лучший ответ

Period в JodaTime представляет собой "набор значений продолжительности поля". Поэтому методы getMinutes(), getHours() ,... возвращают значение этих полей, а не вычисляют минуты, часы,...

Кроме того, преобразование из Duration задает поля в соответствии с PeriodType и хронологией.

Из API (http://joda-time.sourceforge.net/apidocs/org/joda/time/ReadableDuration.html#toPeriod%28%29):

Период toPeriod()

Преобразует эту продолжительность в экземпляр Period с использованием стандартного типа периода и хронологии ISO.

Будут использоваться только точные поля в типе периода. Таким образом, будут использоваться только часовое, минутное, второе и миллисекундное поля на период. Поля, год, месяц, неделя и день не будут заполнены.

Если продолжительность мала, менее одного дня, то этот метод будет выполняться так, как вы могли бы ожидать, и разделить поля равномерно. Если продолжительность больше одного дня, тогда оставшаяся продолжительность будет храниться в самом большом доступном поле, в этом случае часы.

Это означает, что, поскольку день Duration составляет ровно 24 часа, вся информация хранится в поле часов, а минуты - 0.

См. Этот вопрос для хорошего объяснения различий между Interval, Duration и Period.

1

См. Здесь

Период в 1 день не равен периоду 24 часа или 1 час, равному 60 минутам. Это потому, что периоды представляют собой абстрагированное определение периода времени (например, день не может быть фактически 24 часа, это может быть 23 или 25 на границе перехода на летнее время).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню