Menu
Français

Date en JavaScript : new Date, format et comparaison

Comment fonctionne vraiment l'objet Date en JavaScript : création, formatage, calculs de dates, fuseaux horaires et les pièges classiques à éviter.

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.

index.js
Output
Click Run to see the output here.

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 :

index.js
Output
Click Run to see the output here.

Deux points importants à garder en tête :

  • Dans le constructeur avec plusieurs arguments, les mois commencent à zéro. 2 correspond donc à mars, et janvier c'est 0. C'est une source intarissable de bugs de décalage — cela dit, toute l'API Date utilise 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 le Z) 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 :

index.js
Output
Click Run to see the output here.

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.

index.js
Output
Click Run to see the output here.

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() :

index.js
Output
Click Run to see the output here.

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 :

index.js
Output
Click Run to see the output here.

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 :

index.js
Output
Click Run to see the output here.

Pour trier ou comparer deux dates, les opérateurs de comparaison fonctionnent directement, car ils convertissent automatiquement les dates en nombres :

index.js
Output
Click Run to see the output here.

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 :

index.js
Output
Click Run to see the output here.

Deux points qui méritent d'être soulignés :

  • new Date(date) crée une copie de la date. Comme setDate modifie 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 pour setMonth(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 Date stocke 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.
index.js
Output
Click Run to see the output here.

Si tu as besoin d'afficher une date dans un fuseau horaire précis, passe l'option timeZone à Intl.DateTimeFormat :

index.js
Output
Click Run to see the output here.

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 :

index.js
Output
Click Run to see the output here.

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 Date repré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.DateTimeFormat pour 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.

Apprendre à coder avec Coddy

COMMENCER