Manipulation des dates et heures avec Java 8

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>

Étiquettes: Java DateTime API LocalDateTime LocalDate Duration

Publié le 1 septembre à 14h51