Classe Java LocalDate

LocalDate est une classe de date immuable introduite dans Java 8, qui appartient aujava.timepaquet.

LocalDate représente une date sans fuseau horaire (année-mois-jour), telle que "2023-05-15". LocalDate ne contient pas d'informations sur l'heure et le fuseau horaire, ce qui la rend très adaptée aux scénarios qui ne nécessitent qu'une date, tels que les anniversaires et les jours fériés.


Principales caractéristiques de LocalDate

1. Immuabilité

Les instances de LocalDate sont immuables ; toute opération de modification renvoie un nouvel objet LocalDate au lieu de modifier l'objet d'origine.

2. Sécurité des threads

En raison de son immutabilité, LocalDate est thread-safe et peut être utilisé en toute sécurité dans des environnements multithread.

3. Norme ISO-8601

LocalDate suit le système de calendrier ISO-8601, qui est la norme internationale pour la représentation moderne des dates et de l'heure.


Création d'objets LocalDate

1. Obtenir la date actuelle

LocalDate today = LocalDate.now();
System.out.println("今天的日期: " + today);

2. Créer avec une date spécifique

LocalDate specificDate = LocalDate.of(2023, Month.MAY, 15);
// 或者
LocalDate specificDate2 = LocalDate.of(2023, 5, 15);

3. Analyser à partir d'une chaîne

LocalDate parsedDate = LocalDate.parse("2023-05-15");

Méthodes d'opérations courantes

1. Obtenir des informations sur la date

Exemple

LocalDate date = LocalDate.of(2023, 5, 15);
int year = date.getYear();        // 2023
Month month = date.getMonth();    // MAY
int day = date.getDayOfMonth();   // 15
DayOfWeek dow = date.getDayOfWeek(); // MONDAY
int len = date.lengthOfMonth();   // 31 (jours en mai)
boolean leap = date.isLeapYear(); // false (2023 n'est pas une année bissextile)

2. Addition et soustraction de dates

Exemple

LocalDate tomorrow = today.plusDays(1);
LocalDate nextWeek = today.plusWeeks(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate nextYear = today.plusYears(1);
LocalDate yesterday = today.minusDays(1);

3. Comparaison de dates

Exemple

LocalDate date1 = LocalDate.of(2023, 5, 15);
LocalDate date2 = LocalDate.of(2023, 6, 20);

boolean isBefore = date1.isBefore(date2); // true
boolean isAfter = date1.isAfter(date2);   // false
boolean isEqual = date1.isEqual(date2);   // false

4. Ajustement des dates

Exemple

LocalDate date = LocalDate.of(2023, 5, 15);
LocalDate firstDayOfMonth = date.withDayOfMonth(1);
LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());

Formatage et analyse

1. Formatage des dates

Exemple

LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = date.format(formatter);

2. Analyse d'une chaîne en une date

Exemple

String dateStr = "2023/05/15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date = LocalDate.parse(dateStr, formatter);

Exemples d'applications pratiques

1. Calcul du nombre de jours entre deux dates

Exemple

LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 15);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("Différence de jours : " + daysBetween);

2. Vérifier si une date se trouve dans un intervalle

Exemple

LocalDate dateToCheck = LocalDate.of(2023, 5, 10);
LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 31);
if (dateToCheck.isAfter(startDate) && dateToCheck.isBefore(endDate)) {
    System.out.println("La date se trouve dans l'intervalle");
}

3. Obtenir toutes les dates d'un mois

Exemple

LocalDate date = LocalDate.of(2023, 5, 1);
int daysInMonth = date.lengthOfMonth();

for (int i = 1; i <= daysInMonth; i++) {
    System.out.println(date.withDayOfMonth(i));
}

Exemple complet

Exemple

import java.time.LocalDate;
import java.time.Month;
import java.time.DayOfWeek;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;

public class LocalDateDemo {

    public static void main(String[] args) {
        // 1. Création d'instances de LocalDate
        System.out.println("=== Création d'instances de LocalDate ===");
        LocalDate today = LocalDate.now();
        LocalDate specificDate = LocalDate.of(2023, Month.JULY, 15);
        LocalDate parsedDate = LocalDate.parse("2023-08-20");
       
        System.out.println("Date actuelle : " + today);
        System.out.println("Date spécifique : " + specificDate);
        System.out.println("Date analysée : " + parsedDate);

        // 2. Obtention des informations de date
        System.out.println("\n=== Obtention des informations de date ===);
        System.out.println("Année : " + today.getYear());
        System.out.println("Mois : " + today.getMonth() + " (" + today.getMonthValue() + ")");
        System.out.println("Jour : " + today.getDayOfMonth());
        System.out.println("Jour de la semaine : " + today.getDayOfWeek());
        System.out.println("Jour de l'année : " + today.getDayOfYear());
        System.out.println("Jours dans le mois : " + today.lengthOfMonth());
        System.out.println("Jours dans l'année : " + today.lengthOfYear());
        System.out.println("Est une année bissextile : " + today.isLeapYear());

        // 3. Calcul de date
        System.out.println("\n=== Calcul de date ===);
        System.out.println("Plus 5 jours : " + today.plusDays(5));
        System.out.println("Plus 2 semaines : " + today.plusWeeks(2));
        System.out.println("Plus 3 mois : " + today.plusMonths(3));
        System.out.println("Moins 1 an : " + today.minusYears(1));
       
        System.out.println("Premier jour du mois prochain : " + today.plusMonths(1).withDayOfMonth(1));
        System.out.println("Dernier jour de ce mois : " + today.withDayOfMonth(today.lengthOfMonth()));

        // 4. Comparaison de dates
        System.out.println("\n=== Comparaison de dates ===);
        LocalDate date1 = LocalDate.of(2023, 6, 15);
        LocalDate date2 = LocalDate.of(2023, 6, 20);
       
        System.out.println(date1 + " est " + date2 + " avant ? " + date1.isBefore(date2));
        System.out.println(date1 + " est " + date2 + " après ? " + date1.isAfter(date2));
        System.out.println(date1 + " est égal à " + date2 + "? " + date1.isEqual(date2));
       
        // 5. Calcul de la différence entre dates
        System.out.println("\n=== Calcul de la différence entre dates ===);
        LocalDate startDate = LocalDate.of(2023, 1, 1);
        LocalDate endDate = LocalDate.of(2023, 12, 31);
       
        System.out.println("Nombre de jours entre deux dates : " + ChronoUnit.DAYS.between(startDate, endDate));
        System.out.println("Nombre de mois entre deux dates : " + ChronoUnit.MONTHS.between(startDate, endDate));
        System.out.println("Nombre d'années entre deux dates : " + ChronoUnit.YEARS.between(startDate, endDate));

        // 6. Formatage des dates
        System.out.println("\n=== Formatage des dates ===);
        DateTimeFormatter basicFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        DateTimeFormatter chineseFormatter = DateTimeFormatter.ofPattern(yyyy-MM-dd EEEE, Locale.CHINA);
        DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US);
       
        System.out.println("Format de base : " + today.format(basicFormatter));
        System.out.println("Format chinois : " + today.format(chineseFormatter));
        System.out.println("Format anglais : " + today.format(customFormatter));

        // 7. Autres méthodes utiles
        System.out.println("\n=== Autres méthodes utiles ===);
        System.out.println("Ajusté au lundi suivant : " + today.with(DayOfWeek.MONDAY));
        System.out.println("Est le week-end : " +
            (today.getDayOfWeek() == DayOfWeek.SATURDAY || today.getDayOfWeek() == DayOfWeek.SUNDAY));
       
        // 8. Itération sur une plage de dates
        System.out.println("\n=== Itération sur une plage de dates ===);
        System.out.println("Dates pour les 7 prochains jours :");
        today.datesUntil(today.plusDays(7))
             .forEach(System.out::println);
    }
}

La sortie sera similaire à ce qui suit :

=== 创建 LocalDate 实例 ===
当前日期: 2023-06-15
特定日期: 2023-07-15
解析日期: 2023-08-20

=== 获取日期信息 ===
年: 2023
月: JUNE (6)
日: 15
星期: THURSDAY
一年中的第几天: 166
月份天数: 30
年份天数: 365
是否闰年: false

=== 日期计算 ===
加5天: 2023-06-20
加2周: 2023-06-29
加3个月: 2023-09-15
减1年: 2022-06-15
下个月的第一天: 2023-07-01
本月的最后一天: 2023-06-30

=== 日期比较 ===
2023-06-15 在 2023-06-20 之前? true
2023-06-15 在 2023-06-20 之后? false
2023-06-15 等于 2023-06-20? false

=== 计算日期差 ===
两个日期之间的天数: 364
两个日期之间的月数: 11
两个日期之间的年数: 0

=== 日期格式化 ===
基本格式: 2023/06/15
中文格式: 2023年06月15日 星期四
英文格式: Jun 15, 2023

=== 其他实用方法 ===
调整到下个星期一: 2023-06-19
是否是周末: false

=== 日期范围迭代 ===
接下来7天的日期:
2023-06-15
2023-06-16
2023-06-17
2023-06-18
2023-06-19
2023-06-20
2023-06-21

Résumé

La classe LocalDate est une partie importante de l'API Date-Time de Java 8. Elle fournit de nombreuses méthodes pour gérer les opérations liées aux dates. Comparée aux anciennes classes Date et Calendar, LocalDate est plus intuitive, plus facile à utiliser et sûre pour les threads. Maîtriser LocalDate peut grandement améliorer l'efficacité de la gestion des dates et la lisibilité du code.

Voici ses méthodes courantes :

Méthodes de fabrique statiques

Méthode Description Exemple
static LocalDate now() Obtenir la date actuelle LocalDate.now()
static LocalDate of(int year, int month, int dayOfMonth) Créer avec une année, un mois et un jour spécifiés LocalDate.of(2023, 6, 15)
static LocalDate of(int year, Month month, int dayOfMonth) Créer avec une année, un mois et un jour spécifiés (en utilisant l'énumération Month) LocalDate.of(2023, Month.JUNE, 15)
static LocalDate parse(CharSequence text) Analyser à partir d'une chaîne (format ISO : yyyy-MM-dd) LocalDate.parse("2023-06-15")
static LocalDate parse(CharSequence text, DateTimeFormatter formatter) Analyser en utilisant un format spécifié LocalDate.parse("15/06/2023", DateTimeFormatter.ofPattern("dd/MM/yyyy"))

Obtenir des informations sur la date

Méthode Description Exemple
int getYear() Obtenir l'année 2023
Month getMonth() Obtenir le mois (énumération Month) Month.JUNE
int getMonthValue() Obtenir la valeur du mois (1-12) 6
int getDayOfMonth() Obtenir le jour du mois 15
int getDayOfYear() Obtenir le jour de l'année 166
DayOfWeek getDayOfWeek() Obtenir le jour de la semaine (énumération DayOfWeek) DayOfWeek.THURSDAY
int lengthOfMonth() Retourner le nombre de jours dans le mois 30
int lengthOfYear() Retourner le nombre de jours dans l'année (365 ou 366) 365
boolean isLeapYear() Vérifier s'il s'agit d'une année bissextile false

Opérations sur les dates

Méthode Description Exemple
LocalDate plusDays(long days) Ajouter des jours date.plusDays(5)
LocalDate plusWeeks(long weeks) Ajouter des semaines date.plusWeeks(2)
LocalDate plusMonths(long months) Ajouter des mois date.plusMonths(3)
LocalDate plusYears(long years) Ajouter des années date.plusYears(1)
LocalDate minusDays(long days) Soustraire des jours date.minusDays(5)
LocalDate minusWeeks(long weeks) Soustraire des semaines date.minusWeeks(2)
LocalDate minusMonths(long months) Soustraire des mois date.minusMonths(3)
LocalDate minusYears(long years) Soustraire des années date.minusYears(1)
LocalDate withDayOfMonth(int dayOfMonth) Modifier le jour du mois date.withDayOfMonth(1)
LocalDate withDayOfYear(int dayOfYear) Modifier le jour de l'année date.withDayOfYear(100)
LocalDate withMonth(int month) Modifier le mois date.withMonth(12)
LocalDate withYear(int year) Modifier l'année date.withYear(2024)

Comparaison de dates

Méthode Description Exemple
boolean isAfter(ChronoLocalDate other) Vérifier si c'est après la date spécifiée date1.isAfter(date2)
boolean isBefore(ChronoLocalDate other) Vérifier si la date est antérieure à la date spécifiée date1.isBefore(date2)
boolean isEqual(ChronoLocalDate other) Vérifier si la date est égale à la date spécifiée date1.isEqual(date2)
long until(ChronoLocalDate endDate, ChronoUnit unit) Calculer la durée entre deux dates date1.until(date2, ChronoUnit.DAYS)

Formatage et conversion

Méthode Description Exemple
String format(DateTimeFormatter formatter) Formater en chaîne de caractères date.format(DateTimeFormatter.ISO_DATE)
String toString() Convertir en chaîne au format ISO (yyyy-MM-dd) "2023-06-15"
long toEpochDay() Convertir en nombre de jours depuis 1970-01-01 19531
LocalDateTime atTime(int hour, int minute) Convertir en LocalDateTime date.atTime(14, 30)
LocalDateTime atTime(LocalTime time) Convertir en LocalDateTime date.atTime(LocalTime.now())

Autres méthodes utiles

Méthode Description Exemple
boolean isSupported(ChronoUnit unit) Vérifier si l'unité de temps est prise en charge date.isSupported(ChronoUnit.DAYS)
boolean isSupported(ChronoField field) Vérifier si le champ temporel est pris en charge date.isSupported(ChronoField.HOUR_OF_DAY)
LocalDate with(TemporalAdjuster adjuster) Ajuster la date à l'aide d'un ajusteur date.with(TemporalAdjusters.firstDayOfMonth())

Java File Java java.nio.file.Files

Autres extensions