L'objet Date, c'est un instant précis dans le temps
En JavaScript, un Date représente un instant unique — en interne, ce n'est qu'un nombre de millisecondes écoulées depuis le 1er janvier 1970 UTC (ce qu'on appelle l'« epoch Unix »). Tout le reste — années, mois, jours, fuseaux horaires, formatage — n'est qu'une couche de présentation posée par-dessus ce nombre.
now.getTime() te renvoie le nombre brut de millisecondes. Tout ce qu'un objet Date sait faire — comparer deux dates, ajouter des jours, formater un affichage — se résume à manipuler ce nombre, puis à le réinterpréter.
Garde bien ce modèle en tête. Un Date en JavaScript, ce n'est pas « le 14 mars à Paris ». C'est un instant universel qui peut être affiché comme le 14 mars à Paris, ou le 13 mars à Los Angeles, selon le fuseau horaire depuis lequel tu le regardes.
Créer une date en JavaScript
Il existe quatre façons principales de construire un objet Date :
Deux points importants à garder en tête :
- Dans le constructeur avec plusieurs arguments, les mois commencent à zéro.
2correspond donc à mars, et janvier c'est0. C'est une source intarissable de bugs de décalage — cela dit, toute l'APIDateutilise des mois indexés à partir de 0, donc au moins elle est cohérente avec elle-même. new Date("2026-03-14")(sans heure) est interprété comme minuit UTC. En revanche,new Date("2026-03-14T09:30")(sans leZ) est interprété en heure locale. Cette asymétrie est un piège classique du fuseau horaire en JavaScript.
Pour récupérer « l'instant présent » sous forme de nombre, privilégiez Date.now() — ça évite de créer un objet inutilement :
Date.now() est l'outil idéal pour mesurer un temps écoulé, gérer des timeouts, ou tout ce qui ne demande pas de calcul calendaire.
Lire les différentes parties d'une date
Une fois que vous avez un objet Date en JavaScript, vous récupérez ses composants avec des getters. Chacun existe en deux variantes : une pour l'heure locale, une pour l'UTC.
Les versions locales dépendent de la machine sur laquelle le code tourne. Si tu stockes ou compares des dates entre différents utilisateurs et serveurs, choisis explicitement UTC, sinon tu vas courir après des bugs fantômes. Règle de base : utilise les getters UTC pour tout ce qui part en base de données ou dans un log, et les getters locaux pour tout ce que tu vas afficher à un humain.
N'utilise pas getYear(). C'est une méthode héritée qui renvoie year - 1900 et qui n'existe plus que pour des raisons de compatibilité. Passe toujours par getFullYear().
Formater une date en JavaScript pour l'affichage
Évite date.toString() dès que le rendu compte vraiment — sa sortie dépend de la locale et du moteur JavaScript. Il y a deux formatters qui valent le coup d'être connus.
Pour obtenir une chaîne standard et lisible par une machine, utilise toISOString() :
C'est le format à privilégier pour les logs, le stockage en JSON ou l'envoi via le réseau. Toujours en UTC, jamais ambigu.
Pour un affichage destiné aux utilisateurs, passe plutôt par Intl.DateTimeFormat ou les méthodes toLocale*, qui s'appuient dessus :
Intl.DateTimeFormat gère les locales, les fuseaux horaires et toutes les combinaisons de champs imaginables. Pensez-y avant de bricoler un formatage manuel du style ${year}-${month}-${day} — c'est exactement le genre de concaténation qui génère des bugs de décalage d'un mois.
Comparer deux dates en JavaScript
Deux objets Date qui représentent le même instant ne sont pas égaux avec === — cet opérateur compare l'identité des objets, pas leur valeur. Il faut plutôt comparer leurs timestamps :
Pour trier ou comparer deux dates, les opérateurs de comparaison fonctionnent directement, car ils convertissent automatiquement les dates en nombres :
La soustraction te donne l'écart en millisecondes. Divise par 1000 * 60 * 60 * 24 pour obtenir des jours. Écris cette constante en toutes lettres la première fois ; avec le temps, tu reconnaîtras 86_400_000 au premier coup d'œil.
Arithmétique sur les dates
Il n'existe pas de méthode addDays. L'approche idiomatique, c'est de passer par setDate, setMonth, etc. — ces méthodes acceptent des valeurs hors plage et gèrent le dépassement correctement :
Deux points qui méritent d'être soulignés :
new Date(date)crée une copie de la date. CommesetDatemodifie l'objet en place, copiez toujours d'abord, sinon vous allez altérer la valeur de l'appelant.- Appeler
setDate(35)sur un mois de 31 jours bascule automatiquement au mois suivant. Pareil poursetMonth(14), qui fait avancer l'année. Du coup, faire des calculs sur les dates devient beaucoup moins pénible qu'on pourrait le croire.
Dès que ça se complique — jours ouvrés, événements récurrents, durées qui tiennent compte des mois — passez par une bibliothèque (date-fns, Luxon, ou la future API Temporal). Coder soi-même des calculs de calendrier au-delà du simple « ajouter quelques jours » est un nid à bugs.
Fuseau horaire en JavaScript : ce qu'il faut savoir
Les fuseaux horaires sont de loin la première source de bugs liés aux dates. Voici les règles à graver dans votre tête :
- Un
Datestocke un instant en UTC. Le fuseau horaire n'intervient qu'au moment où vous lisez les composants ou que vous formatez la date. - Le fuseau utilisé par
getHours(),getDate(), etc. est le fuseau local de la machine qui exécute le code. Les serveurs et les navigateurs ne sont souvent pas d'accord entre eux. new Date("2026-03-14")(date seule) est interprétée en UTC.new Date("2026-03-14T00:00")(avec heure, sans fuseau) est interprétée en local.new Date(2026, 2, 14)(composants séparés) est également en local.
Si tu as besoin d'afficher une date dans un fuseau horaire précis, passe l'option timeZone à Intl.DateTimeFormat :
Même instant, deux représentations différentes. L'objet Date en lui-même, lui, n'a pas bougé d'un poil.
Un petit exemple concret
Mettons tout ça en pratique avec une fonction qui formate le temps écoulé depuis un événement :
Timestamps à l'entrée, chaîne lisible à la sortie. C'est la forme que prend 90 % du code de dates dans la vraie vie : on soustrait deux instants, on divise par une unité, on arrondit, on formate.
Ce qu'il faut retenir
- Un
Datereprésente un instant en UTC. Les fuseaux horaires n'entrent en jeu qu'au moment de la lecture ou du formatage. Date.now()pour les timestamps,new Date()pour manipuler un calendrier.toISOString()pour le stockage et les logs,Intl.DateTimeFormatpour l'affichage utilisateur.- Pour comparer, passez par
getTime()ou les opérateurs</>. Jamais===. - Les mois commencent à 0. Attention aussi au piège du parsing des chaînes date seule.
- Pour des calculs de dates sérieux, prenez une bibliothèque dédiée.
La suite : URLs et query strings
Les dates apparaissent souvent dans les URLs — filtrer sur une plage de dates, passer un timestamp en paramètre de requête. Construire et parser des URLs à la main est aussi casse-gueule que de formater des dates à la main, et la bibliothèque standard fournit justement un objet URL qui fait ça proprement. C'est ce qu'on voit ensuite.
Questions fréquentes
Comment récupérer la date du jour en JavaScript ?
Appelez simplement new Date() sans argument. Vous obtenez un objet Date qui représente l'instant exact où le constructeur a été exécuté. Si vous n'avez besoin que d'un timestamp numérique (millisecondes depuis 1970), préférez Date.now() : c'est plus rapide et ça évite d'allouer un objet complet.
Comment comparer deux dates en JavaScript ?
Comparez leurs timestamps, pas les objets Date directement. a.getTime() < b.getTime() fonctionne, et a < b aussi puisque < convertit les dates en nombres. En revanche, a === b ne marchera jamais : === teste l'identité des objets, donc deux Date qui pointent sur le même instant ne seront jamais strictement égales.
Comment formater une date en JavaScript ?
Pour tout ce qui est affiché à l'utilisateur, utilisez Intl.DateTimeFormat ou date.toLocaleDateString() : ils gèrent correctement la langue et le fuseau horaire. Pour un format exploitable par une machine, date.toISOString() renvoie une chaîne standard du type 2026-03-14T09:30:00.000Z. Évitez date.toString() pour stocker une date, son format dépend de la locale.
Pourquoi ma date JavaScript est décalée d'un jour ?
Presque toujours un problème de fuseau horaire. new Date('2026-03-14') est interprété comme minuit UTC, mais date.getDate() renvoie le jour dans le fuseau local — et ça peut tomber sur la veille. Utilisez getUTCDate() pour obtenir le jour en UTC, ou construisez la date avec new Date(year, month, day) qui, lui, travaille directement en heure locale.