如何在Joda中将持续时间转换为期间?

时间:2015-02-05 15:15:31

标签: java jodatime

有人可以解释为什么以下测试失败了吗?

@Test
public void testDuration() {
    Duration duration = Duration.standardDays(1);
    assertTrue(duration.getStandardMinutes() == 1440); //OK
    assertTrue(duration.toPeriod().getMinutes() == 1440); //NOK. result = 0
    assertTrue(new Period(duration.getMillis()).getMinutes() == 1400); //NOK. result = 0
}

2 个答案:

答案 0 :(得分:2)

JodaTime中的Period代表"set of duration field values"。因此,方法getMinutes()getHours(),...返回这些字段的值,而不是计算分钟,小时数......

此外,Duration的转换根据PeriodType和年表设置字段。

从API(http://joda-time.sourceforge.net/apidocs/org/joda/time/ReadableDuration.html#toPeriod%28%29):

  

Period toPeriod()

     

使用标准句点类型和ISO年代表将此持续时间转换为Period实例。

     

仅使用句点类型中的精确字段。因此,仅使用该时段上的小时,分​​钟,秒和毫秒字段。不会填充年,月,周和日字段。

     

如果持续时间很短,不到一天,那么此方法将按预期执行并均匀分割字段。如果持续时间大于一天,则所有剩余持续时间将存储在最大可用字段中,在这种情况下为小时。

这意味着,由于Duration的日期恰好是24小时,所有信息都存储在小时字段中,而分钟则保持为0。

有关IntervalDurationPeriod之间差异的详细说明,请参阅this question

答案 1 :(得分:1)

请参阅here

  

1天的时间不等于24小时的时间,也不等于1小时等于60分钟。这是因为时间段代表时间段的抽象定义(例如,一天可能实际上不是24小时,在夏令时边界可能是23或25)。