```html
Travailler avec les dates et les heures est depuis longtemps un point sensible pour les développeurs JavaScript. L'objet natif Date
, avec ses bizarreries et ses limitations, a poussé de nombreux développeurs vers des bibliothèques tierces comme Moment.js ou date-fns. Cependant, le comité TC39 (responsable de l'évolution de JavaScript) travaille sur une solution : l'API Temporal. Cette approche moderne et complète de la gestion des dates et des heures promet de résoudre les problèmes de longue date liés aux opérations temporelles de JavaScript.
Le problème avec l'objet Date de JavaScript
Avant de plonger dans l'API Temporal, il est important de comprendre les limites de l'objet Date
actuel :
- État mutable : les objets Date peuvent être modifiés sur place, ce qui entraîne des effets secondaires inattendus
- Fonctionnalité limitée : des opérations simples comme l'ajout de jours ou la comparaison de dates nécessitent un code complexe
- Incohérences d'analyse de chaînes : l'analyse des dates à partir de chaînes est notoirement peu fiable sur les navigateurs
- Pas de prise en charge des fuseaux horaires : mauvaise gestion des fuseaux horaires au-delà de l'UTC et de l'heure locale
- Calendrier grégorien uniquement : pas de prise en charge des autres systèmes de calendrier
- API confuse : méthodes comme
getMonth()
renvoyant des valeurs indexées à zéro (0-11 au lieu de 1-12)
Ces problèmes ont rendu le travail avec les dates en JavaScript sujet aux erreurs et frustrant, ce qui a conduit à l'adoption généralisée de bibliothèques tierces.
Présentation de l'API Temporal
L'API Temporal est une proposition d'ajout à JavaScript qui fournit une solution moderne et complète pour travailler avec les dates et les heures. Elle est conçue comme un objet global (Temporal
) qui agit comme un espace de noms de premier niveau (similaire à l'objet Math
), contenant diverses classes pour différentes opérations de date et d'heure.
Les principes clés de l'API Temporal incluent :
- Immuabilité : tous les objets Temporal sont immuables, ce qui élimine les effets secondaires
- Clarté : séparation claire entre les différents types de concepts de date/heure
- Prise en charge des fuseaux horaires : prise en charge de premier ordre de tous les fuseaux horaires, y compris l'arithmétique sécurisée par l'heure d'été
- Plusieurs systèmes de calendrier : prise en charge des calendriers non grégoriens
- Précision : précision nanoseconde pour les calculs de temps
- Cohérence : analyse et formatage standardisés
Types de données clés dans l'API Temporal
L'API Temporal introduit plusieurs classes spécialisées pour gérer différents aspects de la date et de l'heure :
Types de données simples (sans informations de fuseau horaire)
- Temporal.PlainDate : représente une date de calendrier (par exemple, le 24 août 2006) sans heure ni informations de fuseau horaire
- Temporal.PlainTime : représente l'heure de l'horloge murale (par exemple, 19 h 39) sans date ni fuseau horaire
- Temporal.PlainDateTime : combine la date et l'heure de l'horloge murale sans informations de fuseau horaire
- Temporal.PlainYearMonth : représente une année et un mois spécifiques (par exemple, octobre 2020)
- Temporal.PlainMonthDay : représente un mois et un jour sans année (par exemple, le 14 juillet)
Types de données zonées (avec informations de fuseau horaire)
- Temporal.ZonedDateTime : un objet date/heure tenant compte du fuseau horaire et du calendrier, représentant un événement réel à un moment précis du point de vue d'une région particulière
- Temporal.Instant : représente un point fixe dans le temps (heure exacte), sans tenir compte du calendrier ou de l'emplacement
Types supplémentaires
- Temporal.Duration : exprime une durée (par exemple, 5 minutes et 30 secondes)
- Temporal.TimeZone : représente un fuseau horaire et fournit des méthodes de conversion
- Temporal.Calendar : représente un système de calendrier
Travailler avec l'API Temporal
Création d'objets temporels
L'API Temporal offre plusieurs façons de créer des objets :
// Obtenir la date et l'heure actuelles
const now = Temporal.Now.plainDateTimeISO();
console.log(now.toString()); // par exemple, 2023-08-24T14:30:45.123456789
// Juste la date
const today = Temporal.Now.plainDateISO();
console.log(today.toString()); // par exemple, 2023-08-24
// Juste l'heure
const currentTime = Temporal.Now.plainTimeISO();
console.log(currentTime.toString()); // par exemple, 14:30:45.123456789
// Création d'objets à partir de composants
const date = Temporal.PlainDate.from({ year: 2023, month: 8, day: 24 });
const time = Temporal.PlainTime.from({ hour: 14, minute: 30, second: 45 });
const dateTime = Temporal.PlainDateTime.from({
year: 2023,
month: 8,
day: 24,
hour: 14,
minute: 30,
second: 45
});
// Création à partir de chaînes ISO
const dateFromString = Temporal.PlainDate.from("2023-08-24");
const timeFromString = Temporal.PlainTime.from("14:30:45");
const dateTimeFromString = Temporal.PlainDateTime.from("2023-08-24T14:30:45");
Travailler avec les fuseaux horaires
L'API Temporal facilite grandement le travail avec les fuseaux horaires :
// Heure actuelle dans le fuseau horaire local
const localTime = Temporal.Now.zonedDateTimeISO();
console.log(localTime.toString());
// par exemple, 2023-08-24T14:30:45+01:00[Europe/London]
// Heure actuelle dans un fuseau horaire spécifique
const tokyoTime = Temporal.Now.zonedDateTimeISO("Asia/Tokyo");
console.log(tokyoTime.toString());
// par exemple, 2023-08-24T22:30:45+09:00[Asia/Tokyo]
// Conversion entre les fuseaux horaires
const nyTime = localTime.withTimeZone("America/New_York");
console.log(nyTime.toString());
// par exemple, 2023-08-24T09:30:45-04:00[America/New_York]
Arithmétique des dates et des heures
L'une des fonctionnalités les plus puissantes de l'API Temporal est ses opérations arithmétiques intuitives :
// Ajout de temps
const tomorrow = today.add({ days: 1 });
const nextWeek = today.add({ days: 7 });
const twoHoursLater = currentTime.add({ hours: 2 });
// Soustraction de temps
const yesterday = today.subtract({ days: 1 });
const lastWeek = today.subtract({ days: 7 });
const twoHoursEarlier = currentTime.subtract({ hours: 2 });
// Travailler avec les durées
const duration = Temporal.Duration.from({ hours: 2, minutes: 30 });
const laterTime = currentTime.add(duration);
// Trouver la différence entre deux dates
const date1 = Temporal.PlainDate.from("2023-01-01");
const date2 = Temporal.PlainDate.from("2023-08-24");
const difference = date1.until(date2);
console.log(difference.toString()); // P236D (format de durée ISO 8601)
console.log(difference.days); // 236
Modification des composants avec "with"
L'API Temporal fournit un moyen simple de créer de nouveaux objets avec des composants modifiés :
// Modification de l'année d'une date
const nextYear = date.with({ year: date.year + 1 });
// Définition de composants spécifiques
const newDateTime = dateTime.with({ hour: 12, minute: 0, second: 0 });
console.log(newDateTime.toString()); // 2023-08-24T12:00:00
Comparaison d'objets temporels
L'API fournit des méthodes de comparaison intuitives :
const date1 = Temporal.PlainDate.from("2023-08-24");
const date2 = Temporal.PlainDate.from("2023-09-15");
console.log(date1.equals(date2)); // false
console.log(date1.equals(date1)); // true
console.log(date1.before(date2)); // true
console.log(date1.after(date2)); // false
console.log(date1.since(date2).days); // -22
Gestion de l'heure d'été et des heures ambiguës
L'API Temporal gère avec élégance les complexités des transitions de l'heure d'été :
// Création d'une heure qui tombe pendant une transition d'heure d'été
const dstTime = Temporal.ZonedDateTime.from({
timeZone: "America/New_York",
year: 2023,
month: 11,
day: 5,
hour: 1,
minute: 30
});
// L'API vous permet de spécifier comment gérer les heures ambiguës
const dstTimeExact = Temporal.ZonedDateTime.from({
timeZone: "America/New_York",
year: 2023,
month: 11,
day: 5,
hour: 1,
minute: 30,
disambiguation: "earlier" // Options: 'earlier', 'later', 'compatible', 'reject'
});
Prise en charge des calendriers non grégoriens
Contrairement à l'objet Date
, l'API Temporal prend en charge plusieurs systèmes de calendrier :
// Création d'une date dans le calendrier hébreu
const hebrewDate = Temporal.PlainDate.from({
year: 5783,
month: 5,
day: 15,
calendar: "hebrew"
});
// Conversion entre les systèmes de calendrier
const gregorianDate = hebrewDate.withCalendar("iso8601");
Analyse et formatage
L'API Temporal fournit des méthodes intégrées pour l'analyse et le formatage :
// Analyse à partir de chaînes
const date = Temporal.PlainDate.from("2023-08-24");
// Formatage personnalisé
const options = {
year: 'numeric',
month: 'long',
day: 'numeric'
};
console.log(date.toLocaleString("en-US", options)); // August 24, 2023
État actuel et prise en charge du navigateur
Au moment de la rédaction de cet article, l'API Temporal est au stade 3 du processus de proposition TC39, ce qui signifie qu'elle est sur le point d'être finalisée, mais pas encore intégrée à la norme ECMAScript officielle. Bien que la prise en charge native du navigateur soit toujours en attente, les développeurs peuvent utiliser des polyfills comme @js-temporal/polyfill
pour commencer à utiliser cette API dès aujourd'hui :
// Installation du polyfill
// npm install @js-temporal/polyfill
// Utilisation dans votre code
import { Temporal } from "@js-temporal/polyfill";
const now = Temporal.Now.plainDateTimeISO();
Conclusion
L'API Temporal représente une amélioration significative des capacités de gestion des dates et des heures de JavaScript. En résolvant les problèmes de longue date liés à l'objet Date
et en fournissant une API complète et intuitive, elle promet de rendre le travail avec les concepts temporels en JavaScript beaucoup plus agréable et moins sujet aux erreurs.
Les principaux avantages de l'API Temporal incluent :
- Immuabilité : toutes les opérations renvoient de nouveaux objets, ce qui évite les effets secondaires
- Clarté : distinction claire entre les différents types de dates et d'heures
- Complet : couvre tout, des dates simples aux opérations complexes tenant compte des fuseaux horaires
- Intuitif : des méthodes comme
add()
,subtract()
etwith()
rendent les opérations courantes simples - Précis : prend en charge la précision nanoseconde
- Global : prise en charge de plusieurs fuseaux horaires et systèmes de calendrier
En attendant que les navigateurs implémentent cette API en natif, le polyfill permet aux développeurs de commencer à bénéficier de ces améliorations dès aujourd'hui. Alors que les applications Web continuent de devenir plus globales et sensibles au temps, l'API Temporal deviendra sans aucun doute un outil essentiel dans la boîte à outils de chaque développeur JavaScript, mettant enfin fin au besoin de bibliothèques externes pour les opérations de base sur les dates et les heures.
En adoptant l'API Temporal, les développeurs peuvent écrire un code plus propre et plus facile à maintenir qui gère correctement les complexités des dates, des heures et des fuseaux horaires, ce qui se traduit par de meilleures expériences utilisateur dans le monde entier.
```