JavaScript possède un objet intégré Date qui stocke la date et l'heure, et fournit des méthodes pour les gérer.
Il est basé sur la classe java.util.Date de Java, qui a été remplacée au début des années 2010, mais pour des raisons de rétrocompatibilité, le Date de JavaScript est toujours là.
Parce qu'il est difficile de travailler avec les dates en général, et parce que la gestion des fuseaux horaires est mauvaise, voire inexistante, il existe de nombreuses bibliothèques comme moment.js, day.js, date-fns et luxon.
Aucune d'entre elles n'est disponible sur Exercism.
Dans tes propres projets, n'utilise pas un paquet obsolète ou non maintenu comme moment.js, mais appuie-toi sur des alternatives plus modernes comme luxon, ou sur Temporal, qui n'est pas encore largement disponible.
Cet exercice se concentre sur Date, qui restera pertinent jusqu'à la fin de JavaScript.
Un objet Date est une instance de la classe Date.
Il peut être créé sans passer d'arguments à la fonction constructeur.
Le résultat est un objet Date qui représente la date et l'heure actuelles :
const now = new Date();
// => Thu Apr 14 2022 11:46:08 GMT+0530 (India Standard Time)
// Shows current day, date and time (in your time zone).
Si un nombre est passé, il sera interprété comme un timestamp.
Un horodatage est un nombre entier qui représente le nombre de millisecondes écoulées depuis le 1er janvier 1970 UTC+0.
const epoch = new Date(0);
// Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)
const another = new Date(1749508766627);
// Tue Jun 10 2025 00:39:26 GMT+0200 (Central European Summer Time)
On pourrait s'attendre à ce que new Date(0) génère l'objet date « le plus ancien », mais JavaScript convertit la date dans ton fuseau horaire local, ce qui signifie que seules les personnes situées dans un fuseau GMT / UTC+0 obtiendront réellement la valeur de l'époque Unix.
Tu peux passer une string représentant une date au constructeur Date.
Le seul format cohérent d'une implémentation à l'autre est la version simplifiée des fameuses chaînes d'horodatage ISO 8601, reconnues et normalisées au niveau international.
Un instant en UTC ressemble à ceci :
YYYY-MM-DDTHH:mm:ss.mssZ
YYYYMMDDTHHmmss.mssZ
où les substitutions suivantes ont lieu :
| Clé | Description | Valeur par défaut |
|---|---|---|
| YYYY | L'année civile, représentée sur 4 chiffres | |
| MM | Le mois calendaire, représenté sur 2 chiffres | 01 |
| DD | Le jour calendaire, représenté sur 2 chiffres | 01 |
| T | Une lettre littérale T, qui sépare la date de l'heure | |
| HH | Les heures sur une horloge de 24 heures, 2 chiffres | 00 |
| mm | Les minutes, 2 chiffres | 00 |
| ss | Les secondes, 2 chiffres | 00 |
| mss | Les millisecondes, 3 chiffres | 000 |
| Z | Une lettre littérale Z, ou un décalage +/-HH:mm
|
La lettre littérale Z indique UTC (aucun fuseau horaire, pas d'heure d'été).
Comme la plupart des composants ont des valeurs par défaut, on peut valablement omettre des parties à la fin :
YYYY-MM-DD
La valeur par défaut est l'heure 00:00:00.000
Si l'horodatage ne se termine pas par Z, et ne se termine ni par +HH:mm ni par -HH:mm (ce qui indique un décalage de fuseau horaire), alors, pour des raisons historiques, ce qui suit s'applique :
Lorsque le décalage de fuseau horaire est absent, les formes contenant uniquement une date sont interprétées comme une heure UTC et les formes contenant une date et une heure sont interprétées comme une heure locale. L'interprétation comme heure UTC est due à une erreur historique de la spécification, qui n'était pas cohérente avec la norme ISO 8601 mais qui n'a pas pu être corrigée pour des raisons de compatibilité web. Voir Analyseur cassé : un problème de réalité du Web.
D'autres formats acceptés par Date.parse peuvent fonctionner ou non.
Quand tu travailles avec des dates en JavaScript, utilise toujours un horodatage ISO 8601 pour convertir une string en Date.
Les formes contenant uniquement une date sont autorisées, mais tous les formats ISO 8601 ne sont pas pris en charge. Consulte la page d'explication de la version simplifiée sur MDN.
Un objet date existant peut aussi être utilisé comme argument du constructeur.
Cela crée une copie de l'objet Date existant, avec la même date et la même heure.
const t1 = new Date();
const t2 = new Date(t1);
// Values of t1 and t2 will be the same.
Un objet date représentant une date peut être créé en passant trois nombres. Un objet date représentant une date et une heure peut être créé en passant 6 nombres.
const date1 = new Date(95, 11, 17);
// Creates Date for Dec 17 1995 00:00 if your local timezone is equivalent to UTC.
const date2 = new Date(2013, 12, 5, 13, 24, 0);
// Creates Date for Jan 5 2014 13:24 if your local timezone is equivalent to UTC.
La deuxième valeur est le month, qui commence à 0 pour janvier et va jusqu'à 11 pour décembre.
Date.parse()Tu peux trouver des mentions ou des références à une fonction d'analyse de dates, Date.parse.
Comme cette fonction ne comporte que peu d'invariants (de vérités) et que le reste de son implémentation n'est pas spécifié (et donc non standard), il ne faut pas l'utiliser.
Date
Il existe diverses méthodes sur les objets date qui renvoient les composants de la date :
getFullYear(); // Get the year (4 digits)
getMonth(); // Get the month, from 0 to 11.
getDate(); // Get the day of month, from 1 to 31.
getHours(); // Get the hour in a 24 clock, from 0 to 23
getMinutes(); // Get the minutes, from 0 to 59
getSeconds(); // Get the seconds, from 0 to 59
getMilliseconds(); // Get the milliseconds, from 0 and 999
getDay(); // Get the day of week, from 0 (Sunday) to 6 (Saturday).
Chacune d'elles possède une variante set correspondante (par exemple setFullYear) pour mettre à jour la valeur.
Toute valeur en dépassement se reporte sur le composant suivant :
const date = new Date('2025-02-28T12:42:00Z');
// => Fri Feb 28 2025 13:42:00 GMT+0100 (Central European Standard Time)
date.setDate(29);
// there was no February 29th in 2025.
date.getDate();
// => 1
date.toString();
// => Sat Mar 01 2025 13:42:00 GMT+0100 (Central European Standard Time)
Il existe des variantes UTC de toutes les méthodes qui ignorent le fuseau horaire local.
Les objets date possèdent une méthode getTime() qui renvoie l'horodatage UNIX en millisecondes, c'est-à-dire le nombre de millisecondes écoulées depuis minuit au début du 1er janvier 1970, UTC.
De plus, une méthode toISOString() permet de convertir un objet date en une string d'horodatage ISO 8601.
Les opérateurs « supérieur à » (>) et « supérieur ou égal à » (>=), ainsi que « inférieur à » (<) et « inférieur ou égal à » (<=), peuvent être utilisés directement entre deux dates, ou entre une date et un nombre.
Cela fonctionne parce que JavaScript essaie de convertir la date en une valeur primitive.
Lors d'une comparaison entre deux dates, ou entre une date et un nombre, JavaScript appelle [Symbol.toPrimitive]("number"), qui appelle en interne date.valueOf().
Cette dernière est équivalente à un appel à date.getTime().
Si tu ne veux pas dépendre de ce comportement, convertis d'abord la date en nombre avec getTime().
Les dates ne peuvent pas être comparées avec les opérateurs d'égalité (== et ===), mais le résultat de .getTime() peut l'être.
Dans cet exercice, on va travailler sur quelques fonctions pour gérer des rendez-vous. Le système stocke tout dans des strings au format ISO 8601, mais ce n'est pas ainsi que les gens utilisent le calendrier. Différentes fonctions sont nécessaires pour convertir d'un format à l'autre.
Crée un rendez-vous dans n jours, à l'heure actuelle.
La fonction prend n jours et renvoie l'heure du rendez-vous n jours plus tard.
createAppointment(4, now);
// Given now is Sun Oct 05 2022 23:28:43 GMT+0600 (Bangladesh Standard Time)
// => Sun Oct 09 2022 23:28:43 GMT+0600 (Bangladesh Standard Time)
Si le second paramètre now n'est pas utilisé, c'est l'heure actuelle qui est utilisée à la place.
De nombreux outils ne fonctionnent qu'avec le format ISO 8601, normalisé au niveau international.
Écris la fonction getAppointmentTimestamp, qui prend une date et renvoie une string dans ce format.
const appointment = new Date(Date.UTC(2010, 6, 16, 12, 42, 0, 0));
getAppointmentTimestamp(appointment);
// => '2010-07-16T12:42:00.000Z'
Les horodatages sont difficiles à lire ; une fonction qui récupère les détails du rendez-vous devrait aider.
La fonction getAppointmentDetails prend un horodatage au format ISO 8601 et renvoie l'année, le mois, le jour, l'heure et les minutes.
getAppointmentDetails('2022-04-24T08:15:00.000');
// => { year: 2022, month: 3, date: 24, hour: 8, minute: 15 }
La fonction reçoit en premier argument l'heure du rendez-vous et en second argument un objet contenant des options. Tu dois mettre à jour le rendez-vous en fonction des options de l'objet et renvoyer la nouvelle date du rendez-vous. L'objet d'options peut contenir plusieurs options.
updateAppointment('2022-02-09T09:20:00.000', { month: 6 });
// => { year: 2022, month: 6, date: 9, hour: 10, minute: 20 }
La fonction reçoit deux rendez-vous (des horodatages) comme arguments. Tu dois renvoyer la différence entre ces deux instants, en secondes.
Comme une demi-seconde n'a presque aucun sens, arrondis le nombre avant de le renvoyer.
timeBetween('2022-12-12T09:20:00.000', '2022-12-18T08:30:00.000');
// => 515400
Enfin, une fois le rendez-vous créé, le système doit vérifier s'il est valide. Autrement dit, le rendez-vous doit être dans le futur, et non dans le passé.
Écris la fonction isValid, qui prend deux arguments, l'horodatage d'un rendez-vous (string) et l'heure actuelle sous forme d'horodatage (string), et qui renvoie true si le rendez-vous est dans le futur, compte tenu de l'heure actuelle.
isValid('2022-02-11T23:00:00.000', '2022-02-08T23:00:00.000');
// => true
Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.