Formattage de LocalDateTime
// Chaîne vers LocalDateTime String entree = "15/03/2024 14:30"; LocalDateTime parse = LocalDateTime.parse(entree, motif);
</div>#### Formattage de LocalDate
<div>```
public static LocalDate stringVersDate(String texte, String motif) {
return LocalDate.parse(texte, DateTimeFormatter.ofPattern(motif));
}
public static String dateVersString(LocalDate date, String motif) {
return date.format(DateTimeFormatter.ofPattern(motif));
}
LocalDateTime dateTemps = moment.atZone(fuseau).toLocalDateTime(); LocalDate dateSeule = moment.atZone(fuseau).toLocalDate();
// Alternative avec factory LocalDateTime viaFactory = LocalDateTime.ofInstant(ancienneDate.toInstant(), fuseau);
// LocalDateTime vers java.util.Date ZonedDateTime zdt = dateTemps.atZone(fuseau); Date convertie = Date.from(zdt.toInstant());
// LocalDate vers java.util.Date ZonedDateTime debutJour = dateSeule.atStartOfDay(fuseau); Date depuisLocalDate = Date.from(debutJour.toInstant());
</div>### Extraction de LocalDate depuis LocalDateTime
<div>```
LocalDateTime dt = LocalDateTime.now();
LocalDate partieDate = dt.toLocalDate();
boolean passe = cible.isBefore(LocalDateTime.now()); boolean futur = cible.isAfter(LocalDateTime.now()); boolean memeInstant = cible.isEqual(LocalDateTime.now());
</div>Mesure des écarts temporels
---------------------------
Java 8 propose trois approches principales : `Period`, `Duration` et `ChronoUnit`.
### Period : écarts calendaires
<div>```
import java.time.LocalDate;
import java.time.Period;
public class CalculAge {
public static void main(String[] args) {
LocalDate aujourdhui = LocalDate.now();
LocalDate naissance = LocalDate.of(1990, 5, 20);
Period ecoule = Period.between(naissance, aujourdhui);
System.out.printf("%d années, %d mois, %d jours",
ecoule.getYears(), ecoule.getMonths(), ecoule.getDays());
}
}
Duration duree = Duration.between(debut, fin);
long enJours = duree.toDays(); long enHeures = duree.toHours(); long enMinutes = duree.toMinutes(); long enSecondes = duree.getSeconds(); long enMillis = duree.toMillis(); long enNanos = duree.toNanos();
</div>### ChronoUnit : unités flexibels
<div>```
String chaine1 = "2024-11-18 12:10:01";
String chaine2 = "2024-11-18 14:12:09";
DateTimeFormatter formateur = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime t1 = LocalDateTime.parse(chaine1, formateur);
LocalDateTime t2 = LocalDateTime.parse(chaine2, formateur);
// Avec Duration
Duration ecart = Duration.between(t1, t2);
long heuresD = ecart.toHours();
long minutesD = ecart.toMinutes();
long secondesD = ecart.toSeconds();
// Avec ChronoUnit (plus direct)
long heuresCU = ChronoUnit.HOURS.between(t1, t2);
long minutesCU = ChronoUnit.MINUTES.between(t1, t2);
long secondesCU = ChronoUnit.SECONDS.between(t1, t2);
System.out.println(String.format("Écart : %dh %dm %ds",
heuresCU, minutesCU - heuresCU * 60, secondesCU - minutesCU * 60));
Formattage thread-safe
Avant Java 8, SimpleDateFormat posait des problèmes de concurrence. DateTimeFormatter est immuable et thread-safe.
DateTimeFormatter affichage = DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy à HH'h'mm"); String formate = present.format(affichage); System.out.println(formate);
</div>### Construction d'instant précis
<div>```
LocalDateTime fixe = LocalDateTime.of(2024, 12, 25, 10, 0, 0);
// Bornes de la semaine
LocalDate lundi = jourCourant.with(DayOfWeek.MONDAY);
LocalDate dimanche = jourCourant.with(DayOfWeek.SUNDAY);
System.out.println("Semaine : " + lundi + " → " + dimanche);
// Jour en toutes lettres
String nomJour = jourCourant.getDayOfWeek()
.getDisplayName(TextStyle.FULL, Locale.FRENCH);
System.out.println("Jour : " + nomJour);
// Extrémités du mois
LocalDate premier = jourCourant.with(TemporalAdjusters.firstDayOfMonth());
LocalDate dernier = jourCourant.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("Mois : " + premier + " → " + dernier);
// Décalages temporels
LocalDate apresDemain = jourCourant.plusDays(2);
System.out.println("Après-demain : " + apresDemain.getDayOfWeek());
// Bornes journalières
System.out.println("Début : " + jourCourant.atStartOfDay());
System.out.println("Min : " + jourCourant.atTime(LocalTime.MIN));
System.out.println("Max : " + jourCourant.atTime(LocalTime.MAX));
}
</div>### Équivalents pour LocalDateTime
<div>```
LocalDateTime ldt = LocalDateTime.now();
// Bornes du jour courant
LocalDateTime minJour = ldt.with(LocalTime.MIN);
LocalDateTime maxJour = ldt.with(LocalTime.MAX);
// Heure spécifique
LocalDateTime heureFixe = LocalDateTime.of(LocalDate.now(), LocalTime.of(14, 30, 0));
// Ou bien
LocalDateTime autreForme = LocalDate.now().atTime(14, 30, 0);
L'interface TemporalAdjuster, matérialisée par TemporalAdjusters, permet des calculs de dates sophistiqués.
| Méthode | Description |
|---|---|
| firstDayOfMonth / lastDayOfMonth | Premier / dernier jour du mois |
| firstDayOfNextMonth / firstDayOfNextYear | Premier jour du mois / a suivant |
| firstDayOfYear / lastDayOfYear | Premier / dernier jour de l'année |
| firstInMonth / lastInMonth | Premier / dernier occurrence d'un jour donné |
| next / previous | Occurrence suivante / précédente d'un jour |
| nextOrSame / previousOrSame | Comme next/previous, ou date courante si applicable |
| dayOfWeekInMonth | N-ième occurrence d'un jour dans le mois |
// Dernier jour ouvré avant week-end LocalDate vendrediPrecedent = dateBase.with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY));
</div></div>