Comparaison des dates en JavaScript : comment éviter les pièges et accélérer le code
\n\nImaginez : 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\nLa 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\nPourquoi la simple comparaison de dates ne fonctionne-t-elle pas ?
\n\nCommençons par l'erreur classique du débutant. Supposons que nous ayons deux dates :
\n\nlet 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\nAvec 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.
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.
La méthode getTime() : l'étalon-or de la comparaison de dates
\n\nLa 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 :
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\nPourquoi 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.
Mesurons la performance. Voici un petit test dans la console du navigateur :
\n\nlet 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\nUn 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\nComparaison de dates avec valueOf()
\n\nLa 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 :
let date1 = new Date('2024-03-15');\nlet date2 = new Date('2024-03-20');\nconsole.log(date1 < date2);\n\n\nFonctionne en réalité comme :
\n\nconsole.log(date1.valueOf() < date2.valueOf());\n\n\nPar 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