Jodatime 计算 2 个日期范围(几乎是一年)之间的期间的错误

A Bug in Jodatime calculating Period between 2 date range (which is ALMOST a year)

我刚开始使用 Joda Time,一周以来我对结果很满意。我正在尝试获取 'yyyy-MM-dd HH' 格式的两个日期之间的时间范围。

直到我写了一个测试用例,结果在我看来是错误的:

2014-02-05 05 - 2016-02-04 05

乔达结果:

Years: 1 Months: 11 Days: 2 Hours: 0

预期结果:

Years: 1 Months: 11 Days: 30 Hours: 0

我只需要再过 1 天就可以达到整整 2 年....

我不是质量检查人员,但对我来说这肯定是一个错误...我也与我们的质量检查人员讨论过这个问题,她同意了。

我想在 Github 中提出一个错误,但它指出我首先要使用 Whosebug.. 任何澄清将不胜感激。

String hourFormat = "yyyy-MM-dd HH";
String startTime = "2014-02-05 05";
String endTime   = "2016-02-04 05";
DateTimeFormatter hourFormatter = DateTimeFormat.forPattern(hourFormat);
DateTime start = hourFormatter.parseDateTime(startTime);
DateTime end   = hourFormatter.parseDateTime(endTime  );
Interval interval = new Interval(start, end);
Period period = interval.toPeriod();
System.out.println(String.format(
  "Years: %d  Months: %d  Days: %d  Hours: %d",
  period.getYears(), period.getMonths(), period.getDays(), period.getHours()
));

更改以下代码行

Interval interval =   new Interval(start, end);
Period period = interval.toPeriod();

Period period = new Period(start, end, PeriodType.yearMonthDay());

这对我来说确实像是一个错误。当然,由于 Interval 实际上在内部存储了开始和结束日期,因此它应该能够正确转换为 Period (interval.toPeriod())。

我敢打赌,当您直接从两个日期直接计算 Period 时(没有 Interval 的中间步骤),它会工作得很好。示例:

Period period = new Period(start,end);

或者如果计算不正确,周有差异,您可能需要使用(根据 Incorrect jodatime period - years months days):

Period period = new Period(start,end,PeriodType.yearMonthDay());

在Java8个java.time.*库(JSR-310)的情况下,实际上省略了Interval,只允许PeriodDuration。所以在 Java 8 中,你可以这样做:

String hourFormat = "yyyy-MM-dd HH";
DateTimeFormatter hourFormatter = DateTimeFormatter.ofPattern(hourFormat);
LocalDateTime start = LocalDateTime.parse("2014-02-05 05",hourFormatter);
LocalDateTime end   = LocalDateTime.parse("2016-02-04 05",hourFormatter);

// Duration duration = Duration.between(start, end);
Period period = Period.between(start.toLocalDate(), end.toLocalDate());

System.out.println(
  String.format("Years: %d  Months: %d  Days: %d  Hours: xxx",
  period.getYears(), period.getMonths(), period.getDays())
);

另一个明显的限制是 JSR-310 中的 Period 只有几天(而不是几小时)的分辨率。

另请参阅此以供进一步参考:Is there a class in java.time comparable to the Joda-Time Interval?