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
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 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 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 firstDayOfMonth = date.withDayOfMonth(1);
LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());
Formatage et analyse
1. Formatage des dates
Exemple
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = date.format(formatter);
2. Analyse d'une chaîne en une date
Exemple
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 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 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
int daysInMonth = date.lengthOfMonth();
for (int i = 1; i <= daysInMonth; i++) {
System.out.println(date.withDayOfMonth(i));
}
Exemple complet
Exemple
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 java.nio.file.Files