#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());