codestory

Die Anleitung zu Java TemporalAccessor

  1. TemporalAccessor
  2. TemporalAccessor methods
  3. query(TemporalQuery<R>)
  4. range(TemporalField)
  5. get(TemporalField)
  6. getLong(TemporalField)
  7. isSupported(TemporalField)

1. TemporalAccessor

Die Interface TemporalAccessor simuliert ein gemeinsames Konzept zwischen den Konzepten Datum, Uhrzeit, Zeitversatz, Zeitzonenversatz und Ära. Es bietet grundlegende Methoden zum Abrufen von Informationen aus diesen Objekten.
public interface TemporalAccessor
Liste der Unterklassen oder enum, die die Interface TemporalAccessor implementieren:
TemporalAccessor ist eine Interface auf Framework-Ebene. Seien Sie bei der Verwendung in Ihrer Anwendung vorsichtig, da es sich um eine Basisschnittstelle verschiedener Kalendersysteme handelt, die in der Java Date Time API unterstützt werden. Eine ausführlichere Diskussion finden Sie in der Interface ChronoLocalDate .
  • Die Anleitung zu Java ChronoLocalDate
Hinweis: Wenn Sie beabsichtigen, Klassen zu schreiben, die die Interface TemporalAccessor implementieren, sollten Sie Klassen mit Unveränderlichkeit schreiben, um mit der Java Date Time API konsistent zu sein (obwohl dies nicht erforderlich ist).

2. TemporalAccessor methods

public boolean isSupported(TemporalField field);

public default ValueRange range(TemporalField field)  

public default int get(TemporalField field)  

public long getLong(TemporalField field);

public default <R> R query(TemporalQuery<R> query)

3. query(TemporalQuery<R>)

Fragen Sie dieses Objekt TemporalAccessor mit dem angegebenen Objekt TemporalQuery ab, um Informationen zu extrahieren.
public default <R> R query(TemporalQuery<R> query)
Beispiele zu diesem Thema finden Sie im Artikel über TemporalQuery:

4. range(TemporalField)

Ein Objekt ValueRange zurückgeben, das einen Bereich gültiger Werte für das angegebene Feld beschreibt. Dies ist eine Standardmethode der Interface TemporalAccessor. Es kann in Unterklassen von TemporalAccessor überschrieben werden.
public default ValueRange range(TemporalField field) {
    if (field instanceof ChronoField) {
        if (isSupported(field)) {
            return field.range();
        }
        throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }
    Objects.requireNonNull(field, "field");
    return field.rangeRefinedBy(this);
}
Grundsätzlich enthält das Objekt ValueRange den minimalen und maximalen Wert eines bestimmten Felds in einem Datentyp long . Wenn das angegebene Feld keinen Bereich hat oder nicht unterstützt wird, wird eine UnsupportedTemporalTypeException ausgelöst.
ChronoField ist eine enum, die die Interface TemporalField implementiert, die Standardfelder enthält und für die Verwendung in der Java Date Time API ausreichend ist.
  • ChronoField.DAY_OF_WEEK
  • ChronoField.DAY_OF_YEAR
  • ChronoField.HOUR_OF_DAY
  • ...
TemporalAccessor_range_x1.java
package org.o7planning.temporalaccessor.ex;

import java.time.LocalDateTime;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.ValueRange;

public class TemporalAccessor_range_x1 {

    public static void main(String[] args) {

        TemporalAccessor localDateTime = LocalDateTime.of(2021, 2, 15, 0, 0, 0);
        System.out.printf("localDateTime: %s%n%n", localDateTime); // 2021-02-15T00:00

        if (localDateTime.isSupported(ChronoField.HOUR_OF_DAY)) {
            ValueRange valueRange1 = localDateTime.range(ChronoField.HOUR_OF_DAY);

            System.out.println("HOUR_OF_DAY range: " + valueRange1); // 0 - 23
            System.out.println("valueRange1.getMinimum(): " + valueRange1.getMinimum()); // 0
            System.out.println("valueRange1.getMaximum(): " + valueRange1.getMaximum()); // 23
        }
        System.out.println(" --------- ");

        if (localDateTime.isSupported(ChronoField.DAY_OF_MONTH)) {
            ValueRange valueRange2 = localDateTime.range(ChronoField.DAY_OF_MONTH);

            System.out.println("DAY_OF_MONTH range: " + valueRange2); // 1 - 28
            System.out.println("valueRange2.getMinimum(): " + valueRange2.getMinimum()); // 1
            System.out.println("valueRange2.getMaximum(): " + valueRange2.getMaximum()); // 28
        }

        System.out.println(" --------- ");

        if (localDateTime.isSupported(ChronoField.DAY_OF_YEAR)) {
            ValueRange valueRange3 = localDateTime.range(ChronoField.DAY_OF_YEAR);

            System.out.println("DAY_OF_MONTH range: " + valueRange3); // 1 - 365
            System.out.println("valueRange3.getMinimum(): " + valueRange3.getMinimum()); // 1
            System.out.println("valueRange3.getMaximum(): " + valueRange3.getMaximum()); // 365
        }
    }
}
Output:
localDateTime: 2021-02-15T00:00

HOUR_OF_DAY range: 0 - 23
valueRange1.getMinimum(): 0
valueRange1.getMaximum(): 23
 ---------
DAY_OF_MONTH range: 1 - 28
valueRange2.getMinimum(): 1
valueRange2.getMaximum(): 28
 ---------
DAY_OF_MONTH range: 1 - 365
valueRange3.getMinimum(): 1
valueRange3.getMaximum(): 365
  • TemporalField
  • ChronoField

5. get(TemporalField)

Gibt den Wert des angegebenen Felds aus diesem Objekt TemporalAccessor als 32-Bit-Integer zurück.
public default int get(TemporalField field) {
    ValueRange range = range(field);
    if (range.isIntValue() == false) {
        throw new UnsupportedTemporalTypeException("Invalid field " + field + " for get() method, use getLong() instead");
    }
    long value = getLong(field);
    if (range.isValidValue(value) == false) {
        throw new DateTimeException("Invalid value for " + field + " (valid values " + range + "): " + value);
    }
    return (int) value;
}
Hinweis: In einigen Fällen sollten Sie die Methode getLong(TemporalField) anstelle von get(TemporalField) verwenden. Der Grund dafür ist, dass der Datentyp int nicht ausreicht, um den Wert einiger Felder zu speichern, z. B. ChronoField.PROLEPTIC_MONTH, ChronoField.EPOCH_DAY.
Zum Beispiel:
TemporalAccessor_get_x1.java
package org.o7planning.temporalaccessor.ex;

import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;

public class TemporalAccessor_get_x1 {

    public static void main(String[] args) {
        TemporalAccessor localDate = LocalDate.of(2021, 2, 15);
        System.out.printf("localDate: %s%n%n", localDate); // 2021-02-15T00:00  
        
        if (localDate.isSupported(ChronoField.YEAR)) {
            int year = localDate.get(ChronoField.YEAR);  
            System.out.println("year: " + year); // 2021
        }

        if (localDate.isSupported(ChronoField.DAY_OF_MONTH)) {
            int dayOfMonth = localDate.get(ChronoField.DAY_OF_MONTH);  
            System.out.println("dayOfMonth: " + dayOfMonth); // 15
        }

        if (localDate.isSupported(ChronoField.DAY_OF_YEAR)) {
            int dayOfYear = localDate.get(ChronoField.DAY_OF_YEAR);
            System.out.println("dayOfYear: " + dayOfYear); // 46
        }
    }
}
  • ChronoField
  • TemporalField

6. getLong(TemporalField)

Gibt den Wert des angegebenen Felds aus diesem Objekt TemporalAccessor als 64-Bit-Integer zurück.
public long getLong(TemporalField field)
Im Grunde ist diese Methode die gleiche wie die Methode get(TemporalField). Der Unterschied besteht darin, dass es den Datentyp long zurückgibt. Der Datentyp int reicht beispielsweise nicht aus, um den Wert des Felds ChronoField.EPOCH_DAY zu speichern, daher müssen Sie die Methode getLong(Temporal) verwenden.
Die folgenden Standardfelder sollten von der Methode getLong(TemporalField) anstelle der Methode get(TemporalField) verwendet werden:
  • ChronoField.PROLEPTIC_MONTH
  • ChronoField.EPOCH_DAY
TemporalAccessor_getLong_x1.java
package org.o7planning.temporalaccessor.ex;

import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;

public class TemporalAccessor_getLong_x1 {

    public static void main(String[] args) {
        TemporalAccessor localDate = LocalDate.of(2021, 2, 15);
        System.out.printf("localDate: %s%n%n", localDate); // 2021-02-15T00:00  
        
        if (localDate.isSupported(ChronoField.EPOCH_DAY)) {
            // Using getLong(TemporalField) method:
            long epochDay  = localDate.getLong(ChronoField.EPOCH_DAY);  
            System.out.println("epochDay: " + epochDay); // 18673
        }

        if (localDate.isSupported(ChronoField.EPOCH_DAY)) {
            // Using get(TemporalField) method:
            int epochDay  = localDate.get(ChronoField.EPOCH_DAY); // --> Exception!
            System.out.println("epochDay: " + epochDay);  
        }
    }
}
Output:
localDate: 2021-02-15

epochDay: 18673
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Invalid field 'EpochDay' for get() method, use getLong() instead
    at java.base/java.time.LocalDate.get0(LocalDate.java:699)
    at java.base/java.time.LocalDate.get(LocalDate.java:650)
    at org.o7planning.temporalaccessor.ex.TemporalAccessor_getLong_x1.main(TemporalAccessor_getLong_x1.java:21)
  • ChronoField
  • TemporalField

7. isSupported(TemporalField)

Überprüfen Sie, ob das angegebene Feld von diesemTemporalAccessor unterstützt wird.
public boolean isSupported(TemporalField field)
(**) Siehe spezifische Klassen für eine Liste der unterstützten Standardfelder.
Zum Beispiel:
  • Die Klasse LocalDate stellt ein Datum dar und enthält weder die Uhrzeit noch die Zeitzone. Es unterstützt Standardfelder wie ChronoField.YEAR, ChronoField.DAY_OF_MONTH,.. aber keine Felder wie ChronoField.SECOND_OF_DAY, ChronoField.HOUR_OF_DAY, ...
  • Die Klasse LocalDateTime stellt ein Datum und eine Uhrzeit dar, enthält jedoch nicht die Zeitzone. Es unterstützt Standardfelder wie ChronoField.YEAR, ChronoField.DAY_OF_MONTH, ChronoField.SECOND_OF_DAY, ChronoField.HOUR_OF_DAY.. aber keine Felder wie ChronoField.OFFSET_SECONDS,...
TemporalAccessor_isSupported_ex1.java
TemporalAccessor localDate = LocalDate.of(2021, 2, 15);

System.out.println("Does localDate support: ");
 
System.out.println(" YEAR ? " + localDate.isSupported(ChronoField.YEAR)); // true
System.out.println(" DAY_OF_MONTH ? " + localDate.isSupported(ChronoField.DAY_OF_MONTH)); // true
System.out.println(" SECOND_OF_DAY ? " + localDate.isSupported(ChronoField.SECOND_OF_DAY)); // false
System.out.println(" HOUR_OF_DAY ? " + localDate.isSupported(ChronoField.HOUR_OF_DAY)); // false
System.out.println(" OFFSET_SECONDS ? " + localDate.isSupported(ChronoField.OFFSET_SECONDS)); // false

System.out.println(" ----- ");

TemporalAccessor localDateTime = LocalDateTime.of(2021, 2, 15, 12, 30, 45);
System.out.println("Does localDateTime support: ");

System.out.println(" YEAR ? " + localDateTime.isSupported(ChronoField.YEAR)); // true
System.out.println(" DAY_OF_MONTH ? " + localDateTime.isSupported(ChronoField.DAY_OF_MONTH)); // true
System.out.println(" SECOND_OF_DAY ? " + localDateTime.isSupported(ChronoField.SECOND_OF_DAY)); // true
System.out.println(" HOUR_OF_DAY ? " + localDateTime.isSupported(ChronoField.HOUR_OF_DAY)); // true
System.out.println(" OFFSET_SECONDS ? " + localDate.isSupported(ChronoField.OFFSET_SECONDS)); // false
Output:
Does localDate support:
 YEAR ? true
 DAY_OF_MONTH ? true
 SECOND_OF_DAY ? false
 HOUR_OF_DAY ? false
 OFFSET_SECONDS ? false
 -----
Does localDateTime support:
 YEAR ? true
 DAY_OF_MONTH ? true
 SECOND_OF_DAY ? true
 HOUR_OF_DAY ? true
 OFFSET_SECONDS ? false
  • TemporalField
  • ChronoField