La gestion du temps est le domaine où l'on se fait avoir le plus souvent, dans tous les langages. JavaScript ajoute deux particularités bien à lui : les mois numérotés à partir de zéro, et une conversion de fuseau horaire qui se déclenche sans prévenir.
Une fois ces deux points compris, l'objet Date devient prévisible, et la mise en forme se délègue entièrement à l'interface d'internationalisation du navigateur.
Définition
Un objet Date représente un instant unique, stocké en interne comme un nombre de millisecondes écoulées depuis le 1er janvier 1970 à minuit UTC. Toutes les méthodes de lecture ne sont que des façons différentes de présenter ce même nombre.
const d = new Date("2026-08-20T10:00:00Z");
console.log(d.getFullYear()); // 2026
console.log(d.getUTCMonth()); // 7 et non 8 : les mois partent de 0
console.log(d.getUTCDate()); // 20
console.log(d.toISOString()); // "2026-08-20T10:00:00.000Z"
console.log(typeof d.getTime()); // "number"L'opérateur new est obligatoire. Sans lui, Date() renvoie une chaîne au lieu d'un objet, ce qui casse tout le reste sans message d'erreur.
Les mois vont de 0 à 11, mais les jours du mois de 1 à 31. Cette incohérence date des origines du langage et ne sera jamais corrigée. getDay(), de son côté, renvoie le jour de la semaine, avec 0 pour dimanche.
Le piège du fuseau horaire
La façon d'écrire la date au moment de sa création change son interprétation.
| Écriture | Interprétation |
|---|---|
"2026-08-20" | Minuit UTC |
"2026-08-20T10:00:00Z" | 10 h UTC, sans ambiguïté |
new Date(2026, 7, 20) | Minuit dans le fuseau local |
La première ligne est celle qui surprend : une date seule est lue en UTC, puis affichée dans le fuseau local. Sur un poste situé à l'ouest de Greenwich, à New York par exemple, elle recule d'un jour dès qu'on l'affiche avec getDate(). La règle sûre est de stocker en UTC et de ne convertir qu'à l'affichage.
Formater et calculer
Ne construisez jamais une date lisible à la main. Intl.DateTimeFormat connaît les langues, les ordres jour-mois et les noms de mois.
const d = new Date("2026-08-20T10:00:00Z");
console.log(d.toLocaleDateString("fr-FR", {
timeZone: "UTC", weekday: "long", day: "numeric", month: "long", year: "numeric"
}));
// "jeudi 20 août 2026"
const debut = new Date("2026-01-01T00:00:00Z");
const fin = new Date("2026-01-08T00:00:00Z");
console.log((fin - debut) / 86400000); // 7 joursLa soustraction fonctionne parce que les deux objets se convertissent en nombre de millisecondes, un cas de Coercition (conversion de type) qui, pour une fois, rend service. Diviser par 86 400 000 donne un nombre de jours.
Questions fréquentes
Comment obtenir la date du jour ?
new Date() sans argument renvoie l'instant courant, et Date.now() le même instant directement en millisecondes. La seconde forme est préférable pour mesurer une durée, puisqu'elle évite de créer un objet dont on n'utiliserait qu'un seul nombre.
Comment ajouter des jours à une date ?
Le plus simple est de passer par setDate(d.getDate() + 7), qui gère les changements de mois et les années bissextiles tout seul. Attention, cette méthode modifie l'objet existant au lieu d'en créer un nouveau : recopiez la date avant si l'original doit rester intact.
Faut-il une bibliothèque pour gérer les dates ?
De moins en moins. Intl couvre le formatage, qui était le besoin principal, et l'API Temporal arrive progressivement dans les navigateurs pour traiter les fuseaux et les durées proprement. Une bibliothèque reste justifiée sur de l'analyse de formats variés ou du calcul de calendrier avancé, beaucoup moins pour afficher une date.