有什么方法可以将JodaTime周期转换为十进制小时数?

jba*_*arz 11 java period jodatime

我有一个JodaTime Period,我是从两个DateTime时刻创建的.有没有一种方法可以将该期间转换为十进制小时数?

例如,我有一个时间段,从2010年1月1日下午1点到1点30分.我怎样才能将该时间段视为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);
Run Code Online (Sandbox Code Playgroud)

这种感觉就像一个黑客,当我开始将Periods加在一起时更别提尴尬了.似乎应该有更好的方法.

有任何想法吗?谢谢

Jon*_*eet 14

如果你有两个DateTimes,我希望你有一个Duration介于它们之间而不是Period......但除此之外和Mike的评论,看起来是正确的:

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);
Run Code Online (Sandbox Code Playgroud)

请注意,您可以避免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);
Run Code Online (Sandbox Code Playgroud)