Français

Un guide approfondi sur l'API Temporal de JavaScript, une solution moderne pour gérer efficacement les dates et les heures dans divers contextes internationaux.

API Temporal de JavaScript : Gestion Moderne de la Date et de l'Heure pour un Public Mondial

L'objet `Date` de JavaScript a longtemps été une source de frustration pour les développeurs. Sa mutabilité, son API incohérente et sa mauvaise gestion des fuseaux horaires ont conduit à la création de nombreuses bibliothèques comme Moment.js et date-fns pour combler les lacunes. Désormais, avec l'API Temporal, JavaScript offre une solution moderne et intégrée pour gérer les dates et les heures avec une clarté et une précision améliorées. Cet article propose un aperçu complet de l'API Temporal, en se concentrant sur ses fonctionnalités, ses avantages et son utilisation dans divers contextes internationaux.

Qu'est-ce que l'API Temporal ?

L'API Temporal est un nouvel objet global en JavaScript conçu pour pallier les défauts de l'objet `Date`. Elle fournit une API claire et immuable pour travailler avec les dates, les heures, les fuseaux horaires et les systèmes de calendrier. De manière cruciale, elle vise à représenter les concepts de date et d'heure d'une manière qui correspond mieux à l'usage et aux attentes du monde réel, rendant l'internationalisation beaucoup plus simple.

Fonctionnalités Clés :

Objets Temporal de Base

L'API Temporal introduit plusieurs nouveaux types d'objets. Voici quelques-uns des principaux :

Travailler avec les Dates

Créer un `Temporal.PlainDate`

Pour créer un `Temporal.PlainDate`, vous pouvez utiliser le constructeur :

const plainDate = new Temporal.PlainDate(2024, 10, 27); // Année, Mois (1-12), Jour
console.log(plainDate.toString()); // Sortie : 2024-10-27

Vous pouvez également utiliser la méthode `from`, qui accepte une chaîne de caractères au format ISO 8601 :

const plainDateFromString = Temporal.PlainDate.from('2024-10-27');
console.log(plainDateFromString.toString()); // Sortie : 2024-10-27

Obtenir les Composants de la Date

Vous pouvez accéder aux composants individuels de la date en utilisant des propriétés comme `year`, `month` et `day` :

console.log(plainDate.year); // Sortie : 2024
console.log(plainDate.month); // Sortie : 10
console.log(plainDate.day); // Sortie : 27

Arithmétique des Dates

Pour ajouter ou soustraire des jours, des semaines, des mois ou des années, utilisez les méthodes `plus` et `minus`. Ces méthodes retournent un nouvel objet `Temporal.PlainDate` :

const nextWeek = plainDate.plus({ days: 7 });
console.log(nextWeek.toString()); // Sortie : 2024-11-03

const lastMonth = plainDate.minus({ months: 1 });
console.log(lastMonth.toString()); // Sortie : 2024-09-27

Comparer les Dates

Vous pouvez comparer des dates en utilisant la méthode `compare` :

const date1 = new Temporal.PlainDate(2024, 10, 27);
const date2 = new Temporal.PlainDate(2024, 11, 15);

console.log(Temporal.PlainDate.compare(date1, date2)); // Sortie : -1 (date1 est antérieure à date2)

Travailler avec les Heures

Créer un `Temporal.PlainTime`

Pour créer un `Temporal.PlainTime`, utilisez le constructeur :

const plainTime = new Temporal.PlainTime(10, 30, 0); // Heure, Minute, Seconde
console.log(plainTime.toString()); // Sortie : 10:30:00

Ou utilisez la méthode `from` avec une chaîne de caractères d'heure au format ISO 8601 :

const plainTimeFromString = Temporal.PlainTime.from('10:30:00');
console.log(plainTimeFromString.toString()); // Sortie : 10:30:00

Obtenir les Composants de l'Heure

console.log(plainTime.hour); // Sortie : 10
console.log(plainTime.minute); // Sortie : 30
console.log(plainTime.second); // Sortie : 0

Arithmétique des Heures

const later = plainTime.plus({ minutes: 15 });
console.log(later.toString()); // Sortie : 10:45:00

Travailler avec la Date et l'Heure Ensemble

Créer un `Temporal.PlainDateTime`

Vous pouvez créer un `Temporal.PlainDateTime` directement ou en combinant un `Temporal.PlainDate` et un `Temporal.PlainTime` :

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
console.log(plainDateTime.toString()); // Sortie : 2024-10-27T10:30:00

const date = new Temporal.PlainDate(2024, 10, 27);
const time = new Temporal.PlainTime(10, 30, 0);
const combinedDateTime = date.toPlainDateTime(time);
console.log(combinedDateTime.toString()); // Sortie : 2024-10-27T10:30:00

Fuseaux Horaires

Gérer correctement les fuseaux horaires est crucial pour les applications traitant avec des utilisateurs situés dans différents endroits. L'API Temporal fournit une prise en charge robuste des fuseaux horaires grâce aux objets `Temporal.ZonedDateTime` et `Temporal.TimeZone`.

Créer un `Temporal.ZonedDateTime`

Pour créer un `Temporal.ZonedDateTime`, vous avez besoin d'un `Temporal.PlainDateTime` et d'un identifiant de fuseau horaire. Les identifiants de fuseau horaire sont basés sur la base de données des fuseaux horaires de l'IANA (par ex., `America/Los_Angeles`, `Europe/London`, `Asia/Tokyo`).

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);
console.log(zonedDateTime.toString()); // Sortie : 2024-10-27T10:30:00-07:00[America/Los_Angeles] (Le décalage dépendra des règles de l'heure d'été)

Alternativement, créez un `Temporal.ZonedDateTime` à partir d'un `Instant`.

const instant = Temporal.Instant.fromEpochSeconds(1666866600); // Horodatage d'exemple
const zonedDateTimeFromInstant = instant.toZonedDateTimeISO(timeZone); // Fuseau horaire comme 'America/Los_Angeles'
console.log(zonedDateTimeFromInstant.toString());

Convertir Entre Fuseaux Horaires

Vous pouvez convertir un `Temporal.ZonedDateTime` vers un autre fuseau horaire en utilisant la méthode `withTimeZone` :

const newTimeZone = 'Europe/London';
const zonedDateTimeInLondon = zonedDateTime.withTimeZone(newTimeZone);
console.log(zonedDateTimeInLondon.toString()); // Sortie : 2024-10-27T18:30:00+01:00[Europe/London]

Travailler avec les Décalages Horaires

La méthode `getOffsetStringFor` de l'objet `Temporal.TimeZone` fournit la chaîne de caractères du décalage pour un `Temporal.Instant` donné :

const timeZoneObject = new Temporal.TimeZone(timeZone);
const offsetString = timeZoneObject.getOffsetStringFor(zonedDateTime.toInstant());
console.log(offsetString); // Sortie : -07:00 (Dépendant des règles de l'heure d'été)

Il est essentiel d'utiliser les identifiants de fuseau horaire IANA corrects pour des calculs précis. Ces identifiants sont maintenus et mis à jour régulièrement pour refléter les changements d'heure d'été et les limites des fuseaux horaires.

Durées

L'objet `Temporal.Duration` représente un laps de temps. Il peut être utilisé pour ajouter ou soustraire des dates et des heures.

Créer une `Temporal.Duration`

Vous pouvez créer une `Temporal.Duration` en utilisant le constructeur, en spécifiant les années, mois, jours, heures, minutes, secondes, millisecondes, microsecondes et nanosecondes :

const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9); // Années, Mois, Jours, Heures, Minutes, Secondes, Millisecondes, Microsecondes, Nanosecondes
console.log(duration.toString()); // Sortie : P1Y2M3DT4H5M6.007008009S

Ou en utilisant une chaîne de caractères de durée au format ISO 8601 :

const durationFromString = Temporal.Duration.from('P1Y2M3DT4H5M6S');
console.log(durationFromString.toString()); // Sortie : P1Y2M3DT4H5M6S

Ajouter des Durées aux Dates et aux Heures

const plainDate = new Temporal.PlainDate(2024, 10, 27);
const duration = new Temporal.Duration(0, 0, 7); // 7 jours
const newDate = plainDate.plus(duration);
console.log(newDate.toString()); // Sortie : 2024-11-03

Notez que l'ajout de durées impliquant des mois ou des années à des dates nécessite une attention particulière, car le nombre de jours dans un mois ou une année peut varier.

Systèmes de Calendrier

L'API Temporal prend en charge différents systèmes de calendrier au-delà du calendrier grégorien. C'est crucial pour les applications qui doivent gérer des dates dans divers contextes culturels. Bien que le support soit encore en évolution, il fournit une base pour une expansion future.

Utiliser des Calendriers Alternatifs

Pour utiliser un calendrier spécifique, vous pouvez le spécifier lors de la création d'objets Temporal :

const hebrewDate = new Temporal.PlainDate(5785, 1, 1, { calendar: 'hebrew' });
console.log(hebrewDate.toString()); // La sortie spécifique peut varier selon l'implémentation et le formatage. Nécessite un polyfill dans de nombreux environnements au moment de la rédaction.

Important : La prise en charge des calendriers non grégoriens peut nécessiter des polyfills ou un support spécifique du navigateur/environnement. Consultez la documentation de l'API Temporal et les tableaux de compatibilité des navigateurs pour les informations les plus récentes.

Formater les Dates et les Heures

Alors que l'API Temporal se concentre sur la manipulation des dates et des heures, le formatage est généralement géré par l'objet `Intl.DateTimeFormat`, qui fait partie de l'API d'Internationalisation. Les objets Temporal fonctionnent de manière transparente avec `Intl.DateTimeFormat`.

Utiliser `Intl.DateTimeFormat`

Voici comment formater un `Temporal.PlainDate` en utilisant `Intl.DateTimeFormat` :

const plainDate = new Temporal.PlainDate(2024, 10, 27);
const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatter.format(plainDate)); // Sortie : October 27, 2024

const formatterGerman = new Intl.DateTimeFormat('de-DE', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatterGerman.format(plainDate)); // Sortie : 27. Oktober 2024

Vous pouvez personnaliser les options de formatage pour répondre à vos besoins. Le premier argument de `Intl.DateTimeFormat` est la locale, qui détermine la langue et les conventions régionales utilisées pour le formatage. L'utilisation de différentes locales (par ex., 'en-US', 'de-DE', 'fr-FR', 'ja-JP') produit différents formats de sortie.

Formater un `Temporal.ZonedDateTime`

Le formatage de `Temporal.ZonedDateTime` est similaire, mais vous pouvez également inclure des informations sur le fuseau horaire dans la sortie :

const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);

const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', timeZoneName: 'short' });
console.log(formatter.format(zonedDateTime)); // Sortie : October 27, 2024, 10:30 AM PDT (L'abréviation du fuseau horaire dépend des règles de l'heure d'été)

Meilleures Pratiques d'Internationalisation

Lorsque vous travaillez avec des dates et des heures dans un contexte mondial, gardez à l'esprit les meilleures pratiques suivantes :

Comparaison de l'API Temporal avec l'Ancien Objet Date

Voici un tableau mettant en évidence les principales différences et les avantages de l'API Temporal par rapport à l'ancien objet `Date` :

Fonctionnalité Ancien Objet `Date` API Temporal
Mutabilité Mutable (modifie l'objet original) Immuable (retourne de nouveaux objets)
Prise en Charge des Fuseaux Horaires Limitée et souvent problématique Robuste et précise, basée sur la base de données des fuseaux horaires de l'IANA
API Incohérente et difficile à utiliser Claire, cohérente et intuitive
Précision Milliseconde Nanoseconde
Systèmes de Calendrier Limité au Grégorien Prend en charge les systèmes de calendrier alternatifs (avec un support en évolution)
Internationalisation Nécessite des bibliothèques externes pour une internationalisation robuste Support intégré et intégration transparente avec `Intl.DateTimeFormat`

Support des Navigateurs et Polyfills

Étant une API relativement nouvelle, le support de l'API Temporal par les navigateurs est encore en évolution. Consultez les derniers tableaux de compatibilité des navigateurs (par ex., sur MDN Web Docs) pour voir quels navigateurs et environnements la prennent en charge nativement. Pour les navigateurs plus anciens ou les environnements sans support natif, vous pouvez utiliser des polyfills pour fournir la fonctionnalité de l'API Temporal. Recherchez "Temporal API polyfill" sur le web pour trouver des options appropriées.

Conclusion

L'API Temporal de JavaScript représente une avancée significative dans la gestion des dates et des heures en JavaScript. Son immuabilité, son API claire, sa prise en charge robuste des fuseaux horaires et ses capacités de système de calendrier en font un outil puissant pour les développeurs qui créent des applications nécessitant de travailler avec des dates et des heures de manière précise et fiable dans divers contextes internationaux. Bien que le support des navigateurs soit encore en évolution, les avantages de l'API Temporal la rendent digne d'être apprise et adoptée pour les nouveaux projets. En adoptant l'API Temporal et en suivant les meilleures pratiques d'internationalisation, vous pouvez créer des applications qui offrent une expérience de date et d'heure transparente et précise aux utilisateurs du monde entier.

Pour en Savoir Plus