2016-12-25 47 views
2

如何比较java 8中的两个阶段?如何比较java 8中的两个java.time.Period?

E.g.

Period one = Period.of(10,0,0); 
Period two = Period.of(8,0,0); 

在这种情况下,一个是大于两个。

+8

期间不具有可比性。这是有原因的。例如:是否比30天的期限大或小一个月?答案是,这取决于。您可以将两个句点添加到给定的LocalDate,并查看两个LocalDate中的哪个更大。但结果可能取决于您从哪个LocalDate开始。 –

+1

@JBNizet完全正确地评论和纠正'Period'不是也不应该是可比较的,但是JSR-310设计者已经允许/定义了一个方法'isNegative()',其中包含疯狂的定义和实现来规避“P1M- 30D“问题。重病。 –

回答

1

正确地说,由JB Nizet。 您无法比较Periods,因为Period类中的每个java文档都有类似于java中可用的Period(Duration)的类,您可以使用该类,这取决于您的业务需求。

“添加到ZonedDateTime时,日光节约时间的处理时间和周期不同,持续时间会增加一个确切的秒数,因此一天的持续时间总是24小时。增加一个概念性的日子,试图维持当地的时间。“

Period period = Period.of(10, 0, 0); 
Period period2 = Period.of(10, 0, 0); 

// No compareTo method in period 
System.out.println(period.compareTo(period2)); 

Duration duration = Duration.ofDays(3); 
Duration duration2 = Duration.ofDays(3); 

// Can compare durations as it gives you the exact time 
System.out.println(duration.compareTo(duration2)); 
3

确实两个Period对象的比较没有意义在一般情况下,由于一个月的不确定标准长度。

但是,在许多情况下,您可以很好地生活在类似于下面的实现中。该合同将与compareTo()的合同类似:

public int comparePeriodsApproximately(Period p1, Period p2) { 
    return period2Days(p1) - period2Days(p2); 
} 

private int period2Days(Period p) { 
    if (p == null) { 
     return 0; 
    } 
    return (p.getYears() * 12 + p.getMonths()) * 30 + p.getDays(); 
}