11

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

例如,我有一个时段,从 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);

这种感觉就像是一种 hack,更不用说当我开始将句点添加在一起时很尴尬。似乎应该有更好的方法。

有任何想法吗?谢谢

4

3 回答 3

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

请注意,您可以避免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);
于 2010-07-22T19:21:04.153 回答
3

有点旧,但我最近在看这个,你可以使用DateTimeFormatterBuilder来做到这一点。它有一系列被调用的方法appendFraction...,这些方法将附加一个小时、分钟、秒等的一小部分。

这并不是您在使用 a 时所要求的,但您可以通过在午夜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);
于 2013-02-12T03:26:01.073 回答
1

使用Jon Skeet示例,您有一个Non-terminating decimal expansion Exceptionfrom divide 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); 
于 2017-05-05T12:34:28.793 回答