Comprendre le mécanisme
Instant représente un point sur la ligne du temps ; LocalDateTime représente une date et une heure sans fuseau. Un ZoneId fournit les règles nécessaires à une conversion locale. Une période calendaire et une durée en secondes ne sont pas interchangeables autour des changements d’heure. Les objets java.time sont immuables : une méthode d’ajout retourne une nouvelle valeur.
Raisonner et vérifier
Séparez représentation machine stable et affichage destiné à une locale. Une virgule décimale ou un mois traduit ne doit pas être réinterprété comme un protocole universel. Un ResourceBundle résout des ressources localisées avec une stratégie de repli. Les logs doivent utiliser une corrélation et des champs minimisés ; une API de journalisation ne dispense pas d’éviter les secrets.
Représenter un instant ou une date locale
Instant représente un point sur la ligne du temps, alors qu’une LocalDateTime décrit des composantes locales sans identifier seule un instant mondial unique. Le choix dépend du besoin : un anniversaire n’a pas le même modèle qu’une expiration de token. Définissez le sens de la donnée avant sa sérialisation. Ajouter un format d’affichage ne fournit pas le contexte de zone qui manque à une valeur locale.
Erreur fréquente à comprendre
LocalDateTime identifie seul un instant mondial unique.
Il manque notamment le contexte de fuseau et ses règles.
Le fuseau est un ensemble de règles
ZoneId désigne des règles de zone qui peuvent dépendre de la date. Ne le réduisez pas à un décalage constant simplement parce qu’un exemple d’hiver utilise une valeur donnée. Pour convertir une date locale en instant, choisissez la zone de référence prévue par le contrat. Les échanges machine doivent porter suffisamment d’information pour éviter qu’un serveur et un client appliquent silencieusement deux contextes différents.
Erreur fréquente à comprendre
Un nom de zone est toujours un décalage fixe éternel.
Les règles peuvent changer avec la date.
Heures absentes et heures répétées
Un changement d’heure peut créer une période locale absente ou répétée. Un rendez-vous représenté uniquement par des composantes locales peut donc demander une politique explicite pour être interprété. Testez une date ordinaire et une date proche d’une transition avec les règles de la zone ciblée. L’affichage plausible ne constitue pas une preuve : plusieurs interprétations peuvent exister selon la représentation et les choix du consommateur.
Erreur fréquente à comprendre
Toute heure locale correspond toujours exactement à un instant.
Des chevauchements et intervalles absents sont possibles.
Rendre le temps testable
Une horloge injectée permet de vérifier une limite d’expiration sans attendre réellement son échéance. Le test peut se placer juste avant, exactement à la borne et juste après. Ces cas doivent correspondre à la règle du produit. Évitez de changer l’heure globale d’un environnement partagé pour un exercice : une dépendance temporelle contrôlée donne une preuve plus reproductible et un périmètre plus clair.
Erreur fréquente à comprendre
Un test temporel doit toujours attendre en temps réel.
Le temps peut être une dépendance contrôlée.
Calendrier, durée et immuabilité
Period et Duration expriment des modèles différents, notamment unités calendaires et durée temporelle. Un mois n’est pas toujours trente jours. Les objets de date comme LocalDate sont immuables : plusDays retourne une nouvelle valeur et ne modifie pas l’objet initial. Conservez donc le résultat lorsque vous voulez le changement. Testez les fins de mois et les années bissextiles pour vérifier les hypothèses de votre calcul.
Erreur fréquente à comprendre
Un mois calendaire égale toujours trente jours.
Les calendriers ont des longueurs variables.
La locale organise une présentation
La locale porte des conventions de langue et de formatage ; elle ne remplace pas un fuseau ni l’instant lui-même. Deux utilisateurs peuvent afficher différemment une même donnée machine. Gardez le protocole d’échange séparé de cette présentation pour éviter qu’une virgule, un nom de mois ou un ordre de composantes local change la valeur interprétée par un autre service.
Erreur fréquente à comprendre
Locale change automatiquement le fuseau de chaque instant.
Les notions de langue et de zone sont distinctes.
Une grammaire d’échange explicite
Le format machine doit annoncer sa grammaire et les informations de zone ou décalage nécessaires. Une chaîne lisible par un humain n’est pas forcément non ambiguë pour tous les parseurs. Définissez la politique de refus d’une entrée invalide au lieu de tenter plusieurs interprétations au hasard. Les fixtures doivent couvrir des valeurs limites et des variantes qui semblent proches mais n’appartiennent pas au format accepté.
Erreur fréquente à comprendre
Tout texte de date est interprété universellement pareil.
Les conventions et parseurs peuvent différer.
Représenter exactement les montants
Un float binaire ne garantit pas les calculs décimaux exacts d’un paiement. Pour un échange PHP et Java, choisissez unité, type, bornes et arrondi. Un PSP qui demande un entier dans l’unité mineure ne doit pas recevoir une conversion implicite depuis un affichage localisé. La devise et son contrat d’unité doivent accompagner le montant ; toutes les devises ne suivent pas nécessairement la même règle d’exposant.
Erreur fréquente à comprendre
Un float binaire assure toute précision décimale financière.
Les besoins d’exactitude doivent être pris en compte.
Les règles peuvent évoluer
Les données de fuseau reflètent des règles civiles susceptibles d’être mises à jour. Une application doit donc suivre les versions et le sens de ses données historiques ou futures. Ne supposez pas qu’un décalage observé aujourd’hui restera la bonne règle pour un événement futur. Lors d’une mise à jour, testez les zones et dates importantes pour le produit plutôt que seulement une date locale proche de l’exécution.
Erreur fréquente à comprendre
Une règle de zone est immuable pour toute politique future.
Les mises à jour peuvent refléter des changements civils.
Comparer dans un modèle cohérent
Pour une expiration, comparez des valeurs dans un modèle temporel commun, avec une horloge et une tolérance documentées lorsque le protocole l’exige. Trier des chaînes locales de zones différentes ne prouve pas l’ordre des instants. La décision doit aussi préciser si la borne est inclusive ou exclusive. Les tests aux frontières rendent cette règle visible et empêchent qu’un format d’affichage décide implicitement d’un droit d’accès.
Erreur fréquente à comprendre
Comparer des textes locaux de zones différentes suffit toujours.
La représentation doit correspondre à la propriété recherchée.
Atelier guidé : lire, expliquer et vérifier le code
import java.time.LocalDate;
class Main {
public static void main(String[] args) {
var date = LocalDate.of(2024, 2, 28).plusDays(1);
System.out.print(date);
}
} Le programme part du 28 février 2024 et produit une nouvelle LocalDate en ajoutant un jour. Cette année étant bissextile, le résultat affiché est le 29 février. L’objet initial n’est pas modifié par plusDays ; c’est la valeur retournée qui est affectée à date dans l’exemple. Aucune zone n’est nécessaire pour ce calcul de date calendaire.
Conservez séparément la date initiale et le résultat pour vérifier leur indépendance. Essayez ensuite une fin de mois ordinaire. Pour une expiration réelle, changez de modèle et utilisez un instant avec une horloge contrôlée : une réussite sur une date locale ne démontre pas la bonne interprétation d’une heure ambiguë dans un fuseau. Chaque représentation doit correspondre à la question temporelle effectivement posée.
Montants PHP/Java : exactitude et unité contractuelle
Un montant doit porter une devise et une unité explicites. Dans le contrat posé, le PSP attend un entier d’unité mineure ; multiplier toujours par cent est incorrect pour les devises ou opérations dont l’exposant contractuel diffère.
Utilisez une représentation exacte : entier borné dans l’unité définie, ou décimal exact à la frontière de conversion avec règle d’arrondi explicite. En Java, construisez BigDecimal depuis une chaîne décimale lorsque nécessaire et vérifiez la conversion exacte vers l’entier du contrat. En PHP, évitez de passer par float pour reconstruire les centimes d’une chaîne utilisateur.
Testez devise à deux décimales, devise sans décimales et dépassement de capacité. Les limites d’API et les règles particulières du fournisseur doivent être vérifiées pour le type d’opération concerné. Une valeur exacte dans la mauvaise devise reste erronée ; un montant positif ne prouve pas non plus que l’acteur a le droit de débiter ou rembourser cette somme.
Points de vigilance : Les flottants binaires et la règle universelle de deux décimales introduisent des erreurs. Sans devise, l’unité et les opérations autorisées deviennent ambiguës. Une représentation de présentation locale n’est pas un contrat machine universel. Des unités explicites et une arithmétique exacte rendent les conversions vérifiables ; gérer également arrondis et dépassements.
Documentation de référence ↗Exemple commenté
var date = java.time.LocalDate.of(2026, 1, 31);
var next = date.plusDays(1);
System.out.println(date);
System.out.println(next);La date initiale reste au 31 janvier ; next vaut le 1er février. Ignorer la valeur retournée aurait perdu le changement demandé.
Exercice de mise en pratique
Définissez le format d’un événement de réservation et son affichage dans deux locales sans altérer l’instant stocké.
Voir une proposition de correction
Transportez un Instant au format ISO et appliquez le fuseau et la locale uniquement à la présentation. Testez une transition d’heure et l’absence de traduction spécifique.
Points de vérification
- Distinguer instant et date locale.
- Conserver les valeurs retournées par java.time.
- Exclure tokens et mots de passe des événements.
Contrôle de connaissances
Cours associé : Temps, localisation et journalisation ↗Validation du module
101 questions, objectif pédagogique de 75 %. Durée conseillée de 150 minutes, sans limite imposée. Les questions et les choix sont mélangés ; le corrigé apparaît après validation. Le contrôle rapide de la leçon et l’examen final du cours restent des exercices distincts.
Commencer ou reprendre les 101 questions →Cette marque suit votre propre avancement ; elle ne certifie pas la maîtrise du sujet. Effectuez l’exercice avant de passer à la suite.
