Какой-либо способ преобразовать Период JodaTime в десятичное число часов?

У меня есть Период 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);

Это отчасти чувствует себя подобно взлому, не говоря уже о неловком, когда я начинаю добавлять Периоды вместе. Кажется, что должен быть лучший путь.

Какие-либо идеи?Спасибо

11
задан jbarz 22 July 2010 в 18:59
поделиться

1 ответ

Если у вас есть два 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);
14
ответ дан 3 December 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: