Comparaison des dates en JavaScript : optimisation et performance

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comparaison des dates en JavaScript : comment éviter les pièges et accélérer le code

\n\n

Imaginez : vous développez une boutique en ligne et devez vérifier si une réduction sur un produit a expiré. Ou vous créez un calendrier de tâches où vous devez filtrer les événements d'aujourd'hui. Ou vous compilez des analyses — "afficher toutes les commandes de la dernière semaine". Partout, vous devez comparer deux dates. Cela semble simple, non ? Mais JavaScript, comme toujours, réserve des surprises.

\n\n

La question "Compare two dates with JavaScript" sur Stack Overflow a recueilli des milliers de vues — et ce n'est pas un hasard. Les développeurs, même expérimentés, trébuchent souvent sur des particularités peu évidentes du travail avec les dates. Dans cet article, nous ne montrerons pas seulement comment comparer deux dates, mais nous analyserons aussi quelle méthode est la plus rapide et laquelle est la plus sûre. C'est parti !

\n\n

Pourquoi la simple comparaison de dates ne fonctionne-t-elle pas ?

\n\n

Commençons par l'erreur classique du débutant. Supposons que nous ayons deux dates :

\n\n
let date1 = new Date('2024-03-15');\nlet date2 = new Date('2024-03-20');\n\nconsole.log(date1 < date2);  // true\nconsole.log(date1 > date2);  // false\nconsole.log(date1 == date2); // false\n
\n\n

Avec les opérateurs < et >, tout fonctionne parfaitement. JavaScript convertit les objets Date en nombres (millisecondes) et les compare. Mais l'opérateur == (et le strict ===) se comporte différemment. Il compare les références aux objets, et non leurs valeurs. Deux dates différentes sont deux objets différents, donc == retournera toujours false, même si les dates coïncident à la milliseconde près.

\n\n

C'est le premier piège. D'où la morale : n'utilisez jamais == ou === pour comparer des dates. Utilisez uniquement <, >, <=, >= ou des méthodes spéciales.

\n\n

La méthode getTime() : l'étalon-or de la comparaison de dates

\n\n

La méthode la plus fiable et performante est d'utiliser la méthode getTime(). Elle retourne le nombre de millisecondes écoulées depuis le 1er janvier 1970 (époque Unix). Et JavaScript sait parfaitement comparer des nombres :

\n\n
let date1 = new Date('2024-03-15T10:00:00');\nlet date2 = new Date('2024-03-15T10:00:00');\nlet date3 = new Date('2024-03-20T10:00:00');\n\nconsole.log(date1.getTime() === date2.getTime()); // true\nconsole.log(date1.getTime() < date3.getTime());   // true\nconsole.log(date1.getTime() > date3.getTime());   // false\n
\n\n

Pourquoi est-ce efficace ? Parce que getTime() est une opération très légère. Elle retourne simplement la valeur numérique déjà stockée à l'intérieur de l'objet Date. Aucun parsing, aucun calcul supplémentaire. Juste un nombre.

\n\n

Mesurons la performance. Voici un petit test dans la console du navigateur :

\n\n
let date1 = new Date('2024-01-01');\nlet date2 = new Date('2024-12-31');\n\nconsole.time('getTime');\nfor (let i = 0; i < 1000000; i++) {\n    date1.getTime() < date2.getTime();\n}\nconsole.timeEnd('getTime');\n// Résultat : ~5-10 ms dans les navigateurs modernes\n
\n\n

Un million de comparaisons en 10 millisecondes — c'est un excellent résultat. En comparaison, les méthodes alternatives peuvent être 2 à 3 fois plus lentes.

\n\n

Comparaison de dates avec valueOf()

\n\n

La méthode valueOf() fait la même chose que getTime() — elle retourne la représentation numérique de la date. Mais il y a une nuance : lors de l'utilisation des opérateurs de comparaison (<, >, etc.), JavaScript appelle implicitement valueOf() pour les objets Date. Autrement dit, ce code :

\n\n
let date1 = new Date('2024-03-15');\nlet date2 = new Date('2024-03-20');\nconsole.log(date1 < date2);\n
\n\n

Fonctionne en réalité comme :

\n\n
console.log(date1.valueOf() < date2.valueOf());\n
\n\n

Par conséquent, pour les comparaisons simples avec < et >, vous pouvez utiliser directement les objets Date. Mais pour une égalité exacte (===), cela ne fonctionnera pas, et là, vous aurez besoin de getTime() ou de va

Blogs

Book Recommendations