2016-08-23 73 views
1

我刚开始使用Joda时间,一周后我对结果满意。我正在尝试获取格式为“yyyy-MM-dd HH”的两个日期之间的时间范围期限。Jodatime计算中的一个错误在两个日期范围(几乎是一年)之间的期间

直到我来到了一个测试情况下,我写作,在我看来,结果是错误的:

2014-02-05 05 - 2016年2月4日05

乔达结果:

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

预期结果:

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

我只需要1天多给它得到一个已满2周岁....

我不是一个QA但可以肯定,这是对我的错误......我也跟我们对此的质量保证和她同意。

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

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() 
)); 
+0

请添加完整的代码示例 – Krease

+0

为了解决我的问题,我需要得到第11个月之后的确切日期和计算出日期和结束日期之间的天数。 **的DateTime daysStartTime = endTime.plusHours(1); ** ** INT天= Days.daysBetween(daysStartTime,结束).getDays(); ** – Rodel

+0

澄清 - 您的代码示例演示他的问题不完整。请让它成为一个独立的可编译示例。 – Krease

回答

1

这似乎喜欢我的错误。当然,由于Interval实际上在内部存储了开始日期和结束日期,因此它应该能够正确转换为一个周期(interval.toPeriod())。

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

Period period = new Period(start,end); 

或者,如果计算不与上周的差异是正确的,你可能需要使用(每Incorrect jodatime period - years months days为):

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

在Java 8 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()) 
); 

其他明显的限制是Period在JSR-310不仅拥有分辨率高达至天(而不是几小时)。

参见本作进一步参考:Is there a class in java.time comparable to the Joda-Time Interval?

+0

是的,我明白这不是一个错误:)因为我刚开始使用乔达时间,由于我没有使用JDK 8的限制。 – Rodel

2

变化的代码

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

以下行

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

解决问题的好工作:)欢迎来到StackOverflow! – Krease

相关问题