2016-12-25 4 views
2

Как сравнить два периода в java 8?Как сравнить два java.time.Period в java 8?

E.g.

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

здесь, в этом случае один больше двух.

+8

Периоды несопоставимы. И для этого есть причина. Например: это период в один месяц больше или меньше, чем период в 30 дней? Ответ в том, что это зависит. Вы можете добавить два периода к данному LocalDate и посмотреть, какой из двух LocalDates больше. Но результат может зависеть от того, с какого сайта LocalDate вы начинаете. –

+1

@JBNizet Полностью правильный комментарий и исправление того, что 'Period' не является и не должно быть сопоставимым, тем не менее дизайнеры JSR-310 разрешили/определили метод' isNegative() 'с безумным определением и реализацией, чтобы обойти« P1M- 30D ". Очень болен. –

ответ

1

Правильно сказано JB Nizet. Вы не можете сравнивать периоды, так как java doc в классе Period имеет аналогичный класс Period (Duration), доступный в java, который вы можете использовать, это зависит от ваших бизнес-требований.

«Продолжительность и периоды различаются в зависимости от летнего времени при добавлении в 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(); 
} 
Смежные вопросы