2016-12-25 1 views
2

Wie vergleiche ich zwei Perioden in Java 8?Wie zwei java.time.Period in Java 8 zu vergleichen?

z.

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

hier ist in diesem Fall einer größer als zwei.

+8

Die Zeiten sind nicht vergleichbar. Und dafür gibt es einen Grund. Zum Beispiel: Ist ein Zeitraum von einem Monat größer oder kleiner als ein Zeitraum von 30 Tagen? Die Antwort ist, dass es abhängt. Sie können die beiden Punkte zu einem gegebenen LocalDate hinzufügen und sehen, welches der beiden LocalDates größer ist. Das Ergebnis kann jedoch davon abhängen, von welchem ​​LocalDate Sie starten. –

+1

@JBNizet Vollständig richtiger Kommentar und korrigieren, dass 'Periode' ist nicht und sollte nicht vergleichbar sein, aber die JSR-310-Designer hat eine Methode' isNegative() 'mit einer verrückten Definition und Umsetzung zu/Umdefiniert die" P1M- 30D "Problem. Sehr krank. –

Antwort

1

Mit Recht gesagt von JB Nizet. Sie können nicht Perioden vergleichen, wie in Java-Dokument in Periode Klasse gibt es ähnliche Klasse zu Zeitraum (Dauer) in Java verfügbar, können Sie das abhängig von Ihrer Geschäftsanforderung verwenden.

"Die Dauer und die Zeiträume unterscheiden sich in der Behandlung der Sommerzeit, wenn sie zu" ZonedDateTime "hinzugefügt werden. Bei einer Dauer wird eine genaue Anzahl von Sekunden hinzugefügt, sodass die Dauer eines Tages immer genau 24 Stunden beträgt fügen Sie einen konzeptionellen Tag hinzu und versuchen Sie, die Ortszeit beizubehalten. "

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

Es stimmt, dass der Vergleich zweier Period Objekte keinen Sinn in einem allgemeinen Fall machen, aufgrund der undefinierten Standardlänge von einem Monat.

In vielen Situationen können Sie jedoch durchaus mit einer ähnlichen Implementierung wie der folgenden leben. Der Vertrag ähnelt dem Vertrag von 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(); 
}