Advanced Java Services | java.time.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 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 | |
---|---|
Methode | Eigenschaft |
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. |
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.
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.
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.
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.
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 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 Methode rechnet gibt die Anzahl der Jahre und Monate als eine Anzahl Monate zurück.
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