Parcours
/
JavaScript
JavaScript
/
Exercices
/
Heure du rendez-vous
Heure du rendez-vous

Heure du rendez-vous

Exercice d'apprentissage

Introduction

JavaScript possède un objet intégré Date qui stocke la date et l'heure, et fournit des méthodes pour les gérer.

Caution

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.

Création

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).

Horodatage Unix (nombre)

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.

Horodatage ISO 8601 (string)

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.

Caution

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.

Objet Date

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.

Fournis les valeurs individuelles des composants de date et d'heure

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.

Accède aux composants de 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.

Convertis à partir d'une date

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.

Compare les dates

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.

Advanced

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.

Instructions

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.

1. Crée un rendez-vous

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.

2. Convertis une date en horodatage

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'

3. Récupère les détails d'un rendez-vous

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 }

4. Mets à jour un rendez-vous avec les options données

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 }

5. Récupère le temps disponible entre deux rendez-vous

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

6. Vérifie si un rendez-vous est valide ou non

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
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
JavaScript Exercism

Prêt à commencer Heure du rendez-vous ?

Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.