Advanced   Java   Services java.time.Period Back Next Up Home



Period

Die Klasse Period modelliert eine Zeitdauer und ist zuständig für die Bereiche von Tage an aufwärts. Für kleinere Einheiten ist die Klasse Duration zuständig.


Factorymethoden

Factorymethoden sind die ofXxx()- und die parse()-Methoden, auch die between() und die from()-Methoden kann man als Factorymethoden auffassen, sie sind (natürlich) allesamt statisch.

Duration
MethodeEigenschaft
of(int years, int months, int days) Obtains a Period representing a number of years, months and days.
ofDays(int days) Obtains a Period representing a number of days.
ofWeeks(int weeks) Obtains a Period representing a number of weeks.
ofMonths(int months) Obtains a Period representing a number of months.
ofYears(int years) Obtains a Period representing a number of years.
parse(CharSequence text) Obtains a Period from a text string such as PnYnMnD.
from(TemporalAmount amount) Obtains an instance of Period from a temporal amount.
Ein TemporalAmount ist eine Duration oder eine Period.


Beispiel zu den ofXxx()-Methoden
Period per1 = Period.ofDays(-4);    // P-4D
Period per1a = Period.ofDays(7);    // P7D

Period per2 = Period.ofWeeks(5);    // P5W
Period per3 = Period.ofMonths(-3);  // P-3M
Period per4 = Period.ofYears(2);    // P2Y

Wie man sieht können die Zeitangaben auch negativ sein. Aus der Ausgabe im UTC-Format sieht man, daß z.Bsp. Tage nicht in Wochen umgerechnet werden.


Beispiel zur of()-Methode

Es gibt nur eine of()-Methode:

Period per1 = Period.of(2,3,4);     // P2Y3M4D
Period per2 = Period.of(2,13,15);   // P2Y13M15D

Auch hier finden keine Umrechnungen statt.


Beispiele zur parse()-Methode

Die parse-Methode birgt einige Überraschungen.

Period dur1 = Period.parse("P-5D");      // P-5D
Period dur2 = Period.parse("P3W-5D");    // P16D
Period dur3 = Period.parse("P2M3W4D");   // P2M25D
Period dur4 = Period.parse("P2M-3W4D");  // P2M-17D

Period dur5 = Period.parse("P2DT2H");
//java.time.format.DateTimeParseException: Text cannot be parsed to a Period

Wochen werden in Tage umgerechnet, kleinere Einheiten als tage führen zu einer Exception.


Die get()-Methoden

Es gibt get-Methode für Days, Months und Years und eine get-Methode der man eine ChronoUnit-Konstante übergeben kann. Alle Methoden liefern nur die Anteile, keine Umrechnungen, lediglich Wochen werden immer in Tage umgewandelt.

Period per = Period.parse("P2Y3M4W5D");
System.out.println(per.getDays());   // 33
System.out.println(per.getMonths()); // 3
System.out.println(per.getYears());  // 2

System.out.println(per.get(ChronoUnit.DAYS));   // 33
System.out.println(per.get(ChronoUnit.MONTHS)); // 3
System.out.println(per.get(ChronoUnit.YEARS));  // 2

//System.out.println(per.get(ChronoUnit.DECADES));  //
//java.time.temporal.UnsupportedTemporalTypeException: Unsupported Unit: Decades

//System.out.println(per.get(ChronoUnit.HOURS));  //
//java.time.temporal.UnsupportedTemporalTypeException: Unsupported Unit: Hours

Hier stellt sich heraus, daß nur drei Konstanten aus ChronoUnit verwendet werden können: ChronoUnit.DAYS, ChronoUnit.MONTHS und ChronoUnit.YEARS. Dies bestätigt auch die getUnits()-Methode.


Die getUnits()-Methode

Mit dieser Methode erhält man einen Hinweis, welche Einheiten aus ChronoUnit verwendet werden können.

System.out.println(per.getUnits());  // [Years, Months, Days]

Die normalized()-Methode

Die Methode rechnet Monatsangeban, die über 11 liegen in Jahre und Monate um.

Period per = Period.parse("P22M3W15D");
System.out.println(per);                  // P22M36D
System.out.println(per.normalized());     // P1Y10M36D

Period per2 = Period.parse("P1Y-20M-3W15D");
System.out.println(per2);                  // P1Y-20M-6D
System.out.println(per2.normalized());     // P-8M-6D

Die toTotalMonths()-Methode

Die Methode rechnet gibt die Anzahl der Jahre und Monate als eine Anzahl Monate zurück.


Die with()-Methoden

Die with-Methoden sind eine Art von set-Methoden und setzen den jeweiligen Teil des Datums, allerdings mit dem wichtigen Unterschied, daß eine neue Instanz geschaffen wird und die alte nicht verändert wird, denn für alle Klassen aus java.time gilt ja der Satz aus der API: This class is immutable and thread-safe.

Period per = Period.parse("P1Y-20M-3W15D");
System.out.println(per);                  // P1Y-20M-6D
System.out.println(per.withDays(13);      // P1Y-20M13D
System.out.println(per.withMonths(3);     // P1Y3M-6D
System.out.println(per.withYears(-2);     // P-2Y-20M-6D


















Valid XHTML 1.0 Strict top Back Next Up Home