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

时间:2010-07-22 18:59:35

标签: java jodatime period

我有一个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);

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

有什么想法吗? 感谢

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:3)

有点旧,但我最近看到了这个,你可以使用DateTimeFormatterBuilder来做到这一点。它有一系列称为appendFraction...的方法,它们会附加一小时,分钟,秒等等。

当您使用Period时,这并不是您所要求的,但您可以通过在午夜制作新DateTime来解决此问题。

此格式化程序应解析您的DateTime:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .appendHourOfDay(1)
    .appendLiteral(".")
    .appendFractionOfHour(1, 2).toFormatter();

然后您可以执行以下操作来转换您的期间:

    DateMidnight midnight = new DateTime("2012-12-13T21:39:45.618").toDateMidnight();
    LocalTime localTime = new LocalTime(midnight);
    localTime.plus(period);
    formatter.print(localTime);

答案 2 :(得分:1)

使用 Jon Skeet 示例,你有一个Non-terminating decimal expansion Exception除以BigDecimal divide(MILLIS_PER_HOUR),修复错误更改代码:

private static final BigDecimal MILLIS_PER_HOUR = 
    BigDecimal.valueOf(DateTimeConstants.MILLIS_PER_HOUR);




    DateTime t = new DateTime();
    DateTime t1 = new DateTime();
    DateTime dt1 = t;
    DateTime dt2 = t1.plusMinutes(46); 
    Duration duration = new Duration(dt1, dt2);
    BigDecimal result = BigDecimal.valueOf(duration.getMillis())
                          .divide(MILLIS_PER_HOUR, 2, RoundingMode.CEILING) // <--- Add scale and RoundingMode.CEILING
                          .setScale(2);