У меня есть Период JodaTime, который я создал с двух моментов DateTime. Существует ли хороший способ преобразовать тот Период в десятичное число часов?
Например, у меня есть Период, который проходит с 13:00 до 13:30 на Jan 1, 2010. Как я могу получить тот Период как 1,5 часа.
В прошлом я вручную преобразовал секунды использования и BigDecimals, такие как это:
int seconds = myPeriod.toStandardSeconds().getSeconds();
BigDecimal d = new BigDecimal((double) seconds / 3600);
// Round to two decimals
BigDecimal correctResult = d.setScale(2, RoundingMode.HALF_DOWN);
Это отчасти чувствует себя подобно взлому, не говоря уже о неловком, когда я начинаю добавлять Периоды вместе. Кажется, что должен быть лучший путь.
Какие-либо идеи?Спасибо
Если у вас есть два DateTimes, я бы ожидал, что между ними будет Duration
, а не Period
... но другое чем это и комментарии Майка, это выглядит правильно:
private static final BigDecimal SECONDS_PER_HOUR =
BigDecimal.valueOf(DateTimeConstants.SECONDS_PER_HOUR);
...
DateTime dt1 = ...;
DateTime dt2 = ...;
Duration duration = new Duration(dt1, dt2);
BigDecimal result = BigDecimal.valueOf(duration.toStandardSeconds().getSeconds())
.divide(SECONDS_PER_HOUR)
.setScale(2, RoundingMode.HALF_DOWN);
Обратите внимание, что вы можете избежать toStandardSeconds (). getSeconds ()
, используя вместо этого Duration.getMillis ()
:
private static final BigDecimal MILLIS_PER_HOUR =
BigDecimal.valueOf(DateTimeConstants.MILLIS_PER_HOUR);
...
DateTime dt1 = ...;
DateTime dt2 = ...;
Duration duration = new Duration(dt1, dt2);
BigDecimal result = BigDecimal.valueOf(duration.getMillis())
.divide(MILLIS_PER_HOUR)
.setScale(2, RoundingMode.HALF_DOWN);