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,只允许Period
和Duration
。所以在 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?
我刚开始使用 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,只允许Period
和Duration
。所以在 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?