Joda-time Period, похоже, неправильно вычисляет дни

#java #jodatime #period

#java #jodatime #период

Вопрос:

Я наблюдаю некоторое странное поведение вокруг класса Joda-time Period , в частности, при обработке дней. В следующем примере кода я указываю период в 26 часов в виде миллисекунд.

 // 26 hour duration
long durationMillis = 26 * 3600 * 1000;
Period period = new Period(durationMillis, PeriodType.dayTime());
// this fails because days == 0
assertEquals(1, period.getDays());
// this would fail because hours == 26
assertEquals(2, period.getHours());
  

Я ожидал, что Period увидит, что 26 часов — это 1 день и 2 часа, но, похоже, он не признает, что день == 24 часа.

Есть идеи, что я делаю не так?

Ответ №1:

Оказывается, что Joda-time — это злая шутка. Я предполагаю, что он не может знать количество часов в сутках из-за перехода на летнее время и других проблем с часовыми поясами. Например, в любом конкретном дне может быть 23 или 25 часов.

Чтобы принудительно установить его на 24 часа в сутки, вам нужно указать Chronology , который соответствует часам в день.

 long durationMillis = 26 * 3600 * 1000;
Period period = new Period(durationMillis, PeriodType.dayTime(),
    ISOChronology.getInstanceUTC());
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this is needed to have 1 day == 24 hours
// this works!
assertEquals(1, period.getDays());
// this works!
assertEquals(2, period.getHours());