1. Présentation de l'API Date/Heure

Présentation de l'API Date/Heure

Les créateurs de Java n'aimaient pas la situation avec les classes Date et Calendar. Ils étaient bons à leur époque, mais les temps changent. Et quelque chose de simple, puissant et fiable est devenu nécessaire. Et avec la sortie de Java 8 (15 ans après Calendarsa parution), l' API Java Date Time a été introduite. Il s'agit d'un ensemble de classes qui devraient être capables de résoudre toutes les tâches possibles liées au temps.

Il y avait tellement de classes qu'elles étaient divisées en plusieurs packages :

Le java.timepackage est le package de base de l'API Java Date Time : il contient des classes telles que LocalDate, LocalTime, LocalDateTime, Instant, Periodet Duration. Tous les objets de ces classes sont immutable, ce qui signifie qu'ils ne peuvent pas être modifiés après la création.

Le java.time.formatpackage contient des classes pour le formatage de l'heure, c'est-à-dire la conversion des heures (et des dates) en chaînes et vice versa. Par exemple, il contient la DateTimeFormatterclasse polyvalente, qui remplace la SimpleDateFormatclasse.

Le java.time.zonepackage contient des classes pour travailler avec les fuseaux horaires. Il contient des classes telles que TimeZoneet ZonedDateTime. Si vous écrivez du code serveur pour des clients situés dans différentes parties du monde, vous aurez vraiment besoin de ces classes.


2. LocalDateclasse

La première et la plus utile des classes de l'API Date/Heure que nous allons examiner est la LocalDateclasse. Comme vous pouvez probablement le deviner d'après son nom, cette classe est conçue pour fonctionner avec des dates.

Les objets de cette classe ne changent pas après leur création, c'est-à-dire que la LocalDateclasse est immuable. Mais cette propriété ajoute simplicité et fiabilité à la classe. Surtout si plusieurs threads (threads d'exécution) interagissent avec un tel objet en même temps.

Pour créer un nouvel LocalDateobjet, vous devez utiliser l'une des méthodes statiques. Voici une liste des principaux.

Obtenir la date actuelle

Pour obtenir la date actuelle, vous devez utiliser la now()méthode statique. C'est beaucoup plus facile qu'il n'y paraît :

LocalDate today = LocalDate.now();

todayest une LocalDatevariable et LocalDate.now()est un appel à la now()méthode statique de la LocalDateclasse.

Exemple:

Code Sortie console
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Obtenir une date dans un fuseau horaire spécifique

La LocalDateclasse a également une variante de la now(ZoneId)méthode qui vous permet d'obtenir la date actuelle dans un fuseau horaire spécifique.

Pour ce faire, nous avons besoin d'une autre classe — la ZoneIdclasse (java.time.ZoneId). Il a une of()méthode qui renvoie un ZoneIdobjet donné le nom du fuseau horaire.

Pour déterminer la date actuelle à Shanghai, vous devez écrire le code suivant :

Code Sortie console
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Vous pouvez trouver une liste des noms de tous les fuseaux horaires sur Internet.


3. Obtenir une date précise

Pour obtenir un LocalDateobjet qui représente une date spécifique, vous devez utiliser la of()méthode statique. Tout ici est aussi très simple et clair :

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

dateest une LocalDatevariable et est un appel à la méthode statique de la classe.LocalDate.of()of()LocalDate

Ici, nous voyons la FEBRUARYconstante de la Monthclasse (java.time.Month) utilisée pour spécifier février comme mois.

Vous pouvez également spécifier le mois à l'ancienne - en utilisant un nombre :

LocalDate date = LocalDate.of(2019, 2, 22);

Deux? Au lieu de février ? Cela signifie-t-il que les mois sont à nouveau numérotés à partir de un ?

Oui, près de 20 ans après la création de Java, les mois ont enfin cessé d'être comptés à partir de zéro.

Exemple:

Code Sortie console
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Obtenir une date par l'index du jour

Il existe une autre façon intéressante de créer une date : en utilisant la ofYearDayméthode, vous pouvez obtenir une date basée uniquement sur le numéro de l'année et l'indice du jour dans l'année. Voici l'aspect général :

LocalDate date = LocalDate.ofYearDay(year, day);

yearest le numéro de l'année et dayest l'index du jour de l'année.

Exemple:

Code Sortie console
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

Le 100e jour de 2019 est le 10 avril.

Obtenir une date Unix

Vous souvenez-vous que Dateles objets ont toujours stocké le temps en nombre de millisecondes depuis le 1er janvier 1970 ? Pour s'assurer que les programmeurs ne rateraient pas le bon vieux temps, la LocalDateclasse s'est dotée d'une ofEpochDay()méthode qui renvoie la date calculée à partir du 1er janvier 1970. Voici l'apparence générale :

LocalDate date = LocalDate.ofEpochDay(day);

dayest le nombre de jours qui se sont écoulés depuis le 1er janvier 1970.

Exemple:

Code Sortie console
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Obtenir des éléments d'une date

Il est impossible de modifier LocalDateles objets, mais vous pouvez obtenir des éléments individuels de la date stockée. LocalDateles objets ont plusieurs méthodes pour cela :

Méthode Description
int getYear()
Renvoie l'année d'une date spécifique
Month getMonth()
Renvoie le mois de la date : une constante parmi plusieurs
JANUARY, FEBRUARY, ...;
int getMonthValue()
Renvoie l'index du mois de la date. Janvier == 1.
int getDayOfMonth()
Renvoie l'indice du jour du mois
int getDayOfYear()
Renvoie l'index du jour depuis le début de l'année
DayOfWeek getDayOfWeek()
Renvoie le jour de la semaine : une constante parmi plusieurs
MONDAY, TUESDAY, ...;
IsoEra getEra()
Renvoie l'ère : soit BCE(Avant l'ère actuelle) soit CE(Ere actuelle)

Exemple:

Code Sortie console
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Changer la date dans un LocalDateobjet

La LocalDateclasse contient plusieurs méthodes qui vous permettent de travailler avec des dates. L'implémentation de ces méthodes est analogue aux méthodes de la Stringclasse : elles ne modifient pas l' LocalDateobjet existant, mais en renvoient un nouveau avec les données souhaitées.

Voici les méthodes de la LocalDateclasse :

Méthode Description
plusDays(int days)
Ajoute un nombre spécifié de jours à la date
plusWeeks(int weeks)
Ajoute des semaines à la date
plusMonths(int months)
Ajoute des mois à la date
plusYears(int years)
Ajoute des années à la date
minusDays(int days)
Soustrait des jours de la date
minusWeeks(int weeks)
Soustrait des semaines de la date
minusMonths(int months)
Soustrait des mois de la date
minusYears(int years)
Soustrait des années à la date

Exemple:

Code Sortie console
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Les birthday objectméthodes dont nous appelons ne changent pas. Au lieu de cela, ses méthodes renvoient de nouveaux objets contenant les données souhaitées.