我写的这个测试为什么在jodatime 1.6.2中失败了?是虫子吗?

@Test
 public void testIfJodaTimePeriodsHandlesPeriodTypesOtherThanMinutesAndHours() {
  long twentyDaysInMillis = TimeUnit.MILLISECONDS.convert(20, TimeUnit.DAYS);
  Period twoWeeks = new Period(twentyDaysInMillis, PeriodType.weeks());
  Assert.assertEquals(2, twoWeeks.getWeeks());
// twoWeeks.getWeeks() actually returns 0!!
 }


仅供参考,即使所有传递给构造函数的毫秒数超过25小时,具有所有PeriodTypes的Periods也只能填写分钟和小时的字段。这是违反直觉的。

最佳答案

这就是Period在JodaTime中的工作方式。

Period具有精确的字段(小时,分钟,秒,毫秒)和不精确的字段(其他)。不精确的字段可能会受到夏令时的影响。也就是说,在夏时制边界上,24小时的Period可能少于一天或一天​​以上。

因此,花费毫秒的构造函数仅填充精确字段。要初始化不精确的字段(不考虑夏令时),您需要:

Period twoWeeks = new Period(twentyDaysInMillis).normalizedStandard(PeriodType.weeks());


也可以看看:


Period javadoc

10-05 19:48