Le Tutoriel de Java TemporalAccessor
1. TemporalAccessor
L'interface TemporalAccessor simule un concept commun entre les concepts de date, d'heure, de décalage horaire, de décalage de fuseau horaire et d'ère. Il fournit des méthodes de base pour obtenir des informations à partir de ces objets.
public interface TemporalAccessor
Liste des sous-classes ou enum(s) qui implémentent l'interface TemporalAccessor :
- Era
- ThaiBuddhistEra
- ChronoLocalDate
- ChronoLocalDateTime
- ChronoZonedDateTime
- LocalDate
- Temporal
- ZoneOffset
- DayOfWeek
- MonthDay
- Month
- IsoEra
- HijrahEra
- JapaneseEra
- MinguoEra
- LocalTime
- LocalDateTime
- ZonedDateTime
- ChronoZonedDateTime
- ThaiBuddhistDate
- MinguoDate
- JapaneseDate
- HijrahDate
- YearMonth
- Year
- OffsetDateTime
- OffsetTime
- Instant
TemporalAccessor est une interface de niveau framework. Soyez prudent lorsque vous l'utilisez dans votre application, car il s'agit d'une interface de base de divers systèmes de calendrier pris en charge dans Java Date Time API . Voir l'interface ChronoLocalDate pour une discussion plus détaillée.
- Le Tutoriel de Java ChronoLocalDate
Remarque : Si vous avez l'intention d'écrire des classes qui implémentent l'interface TemporalAccessor, vous devez écrire des classes immuables pour être cohérentes avec Java Date Time API (bien que cela ne soit pas obligatoire).
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>)
Interroger cet objet TemporalAccessor avec l'objet TemporalQuery spécifié pour extraire des informations.
public default <R> R query(TemporalQuery<R> query)
Voir des exemples à ce sujet dans l'article sur TemporalQuery :
4. range(TemporalField)
Renvoyer un objet ValueRange qui décrit une plage de valeurs valides pour le champ spécifié. Il s'agit d'une méthode par défaut de l'interface TemporalAccessor. Il peut être remplacé dans les sous-classes de TemporalAccessor.
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);
}
À la base, l'objet ValueRange contient la valeur minimale et maximale d'un champ donné dans un type de données long. Si le champ spécifié n'est pas classé ou n'est pas pris en charge, une UnsupportedTemporalTypeException est levée.
ChronoField est une enum qui implémente l'interface TemporalField, qui contient des champs standard et est suffisante pour une utilisation dans Java Date Time API.
- 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)
Renvoyer la valeur du champ spécifié à partir de cet objet TemporalAccessor sous la forme d'un entier 32 bit.
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;
}
Remarque : Dans certains cas, vous devez utiliser la méthode getLong(TemporalField) au lieu de get(TemporalField). La raison en est que le type de données int n'est pas suffisant pour stocker la valeur de certains champs, tels que ChronoField.PROLEPTIC_MONTH, ChronoField.EPOCH_DAY.
Par exemple:
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)
Renvoyer la valeur du champ spécifié à partir de cet objet TemporalAccessor sous la forme d'un entier 64 bit.
public long getLong(TemporalField field)
À la base, cette méthode est la même que get(TemporalField). La différence est qu'il renvoie un type de données long. Par exemple, le type de données int n'est pas suffisant pour stocker la valeur du champ ChronoField.EPOCH_DAY, vous devez donc utiliser la méthode getLong(Temporal).
Les champs standard suivants doivent être utilisés par la méthode getLong(TemporalField) au lieu de la méthode get(TemporalField) :
- 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)
Vérifier si le champ spécifié est pris en charge par ce TemporalAccessor.
public boolean isSupported(TemporalField field)
(**) Voir les classes spécifiques pour une liste des champs standard qu'il prend en charge.
Par exemple:
- La classe LocalDate représente une date et n'inclut pas l'heure et le fuseau horaire. Il prend en charge les champs standard comme ChronoField.YEAR, ChronoField.DAY_OF_MONTH,.. mais pas les champs comme ChronoField.SECOND_OF_DAY, ChronoField.HOUR_OF_DAY, ...
- La classe LocalDateTime représente une date et une heure, mais n'inclut pas le fuseau horaire. Il prend en charge les champs standard tels que ChronoField.YEAR, ChronoField.DAY_OF_MONTH, ChronoField.SECOND_OF_DAY, ChronoField.HOUR_OF_DAY.. mais ne prend pas en charge les champs tels que 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
Tutoriels Java Date Time
- Le Tutoriel de Java ZoneId
- Le Tutoriel de Java Temporal
- Le Tutoriel de Java Period
- Le Tutoriel de Java TemporalAdjusters
- Le Tutoriel de Java MinguoDate
- Le Tutoriel de Java TemporalAccessor
- Le Tutoriel de Java JapaneseEra
- Le Tutoriel de Java HijrahDate
- Le Tutoriel de Java Date, Time
- Qu'est-ce que l'heure d'été (DST)?
- Le Tutoriel de Java LocalDate
- Le Tutoriel de Java LocalTime
- Le Tutoriel de Java LocalDateTime
- Le Tutoriel de Java ZonedDateTime
- Le Tutoriel de Java JapaneseDate
- Le Tutoriel de Java Duration
- Le Tutoriel de Java TemporalQuery
- Le Tutoriel de Java TemporalAdjuster
- Le Tutoriel de Java ChronoUnit
- Le Tutoriel de Java TemporalQueries
Show More
- Tutoriels Java Web Service
- Tutoriels de programmation Java Servlet/JSP
- Tutoriels de JavaFX
- Tutoriels de programmation Java SWT
- Tutoriels Java Oracle ADF
- Java Basic
- Tutoriels de Java Collections Framework
- Tutoriels Java IO
- Tutoriels Struts2
- Tutoriels Spring Boot
- Tutoriels Spring Cloud
- Tutoriels Maven
- Tutoriels Gradle