103 votes

Comment comparer deux dates string en JavaScript?

J'ai deux dates sous forme de chaînes de caractères au format m/j/aaaa. Par exemple, "11/1/2012", "1/2/2013". Je rédige une fonction en JavaScript pour comparer deux dates sous forme de chaînes de caractères. La signature de ma fonction est bool isLater(string1, string2), si la date passée par string1 est postérieure à la date passée par string2, elle renverra true, sinon false. Ainsi, isLater("1/2/2013", "11/1/2012") devrait retourner true. Comment puis-je écrire une fonction JavaScript pour cela?

182voto

Garry Points 695
const d1 = Date.parse("2012-11-01");
const d2 = Date.parse("2012-11-04");

if (d1 < d2) {
  console.log("Error!");
}

Ou, comme mentionné dans les commentaires, comparez directement les chaînes :

if ("2012-11-01" < "2012-11-04") {
  console.log("Error!");
}

18voto

xiaopang Points 300

Vous pouvez simplement comparer 2 chaînes de caractères

function isLater(dateString1, dateString2) {
  return dateString1 > dateString2
}

Ensuite

isLater("2012-12-01", "2012-11-01")

renvoie true alors que

isLater("2012-12-01", "2013-11-01")

renvoie false

17voto

Matt Zeunert Points 5083

Interprétez les dates et comparez-les comme vous le feriez avec des nombres :

function isLater(str1, str2)
{
    return new Date(str1) > new Date(str2);
}

Si vous avez besoin de prendre en charge d'autres formats de date, envisagez une bibliothèque telle que date.js.

3voto

Steven Kuipers Points 552

Parsing directement une chaîne de date qui n'est pas au format yyyy-mm-dd, comme dans la réponse acceptée, ne fonctionne pas. La réponse de vitran fonctionne mais contient du JQuery, j'ai donc un peu retravaillé cela.

// Prend deux chaînes en entrée, le format est jj/mm/aaaa
// retourne true si d1 est inférieur ou égal à d2

function compareDates(d1, d2){
var parts =d1.split('/');
var d1 = Number(parts[2] + parts[1] + parts[0]);
parts = d2.split('/');
var d2 = Number(parts[2] + parts[1] + parts[0]);
return d1 <= d2;
}

P.S. J'aurais commenté directement le post de vitran mais je n'ai pas la réputation pour le faire.

2voto

Jason Points 73

La meilleure façon de comparer des dates sans avoir à les convertir en objets date et vice-versa, est de les conserver sous forme de chaînes de caractères, mais dans un format standard qui est comparable, ce qui signifie qu'elles ont exactement la même longueur, la même syntaxe et dans un ordre logique de grandeur. Je recommande la méthode de chaîne de caractères ISO en javascript pur new Date().toISOString() ou moment moment().toISOString() pour cela. La syntaxe résultante ressemble à ceci: "2023-01-22T05:00:00.000Z" Notez le T et le Z, etc.

JavaScript (et MongoDB) est capable de comparer des chaînes de caractères, via une comparaison binaire simple, ce qui signifie qu'il compare chaque chiffre, de gauche à droite, et celui qui a le chiffre le plus élevé en premier l'emporte. En organisant logiquement les données de l'année jusqu'aux millisecondes, via la grandeur, cela garantit que cette méthode fonctionne à chaque fois. Juste pour vous donner un exemple, si vous mesuriez des distances, et que les unités sont des miles, des yards, des pieds et des pouces, pour comparer deux distances, il est évident que les miles doivent être comparés en premier, n'est-ce pas? Seulement ensuite le reste importe; si vous vérifiez d'abord les pouces et déclarez le gagnant, vous obtiendrez des réponses erronées. Donc de la même manière, dans les dates, les années doivent être comparées en premier car la comparaison se fait de gauche à droite. Vous pouvez vérifier ci-dessous via la console de node:

// les chaînes peuvent être correctement comparées.
"9" > "0" == true; "0" > "9" == false

// elles doivent être dans un ordre logique de gauche à droite en grandeur,
// de l'année au mois jusqu'à la date, sinon vous laisserez le chiffre moins important gagner
"12/31/2000" > "01/01/2999" == true

// le séparateur doit être cohérent, car / vs. - est important
"/" > "-" == true; donc "2000/01/01" > "2000-12-31" == true; 

// elles doivent avoir la même longueur, ajoutez des zéros en tête si nécessaire
"2017/10/26" > "2017/10/7" == false;  "2017/10/26"  > "2017/10/07" == true

// elles doivent avoir une syntaxe cohérente
"T" > " " == true;  
"2023-01-22T05:00:00.000Z" > "2023-01-22 06:00:00" == true

Toutes ces choses sont prises en compte lorsque vous utilisez le format de chaîne de caractères ISO pour stocker la date, qui est la façon dont Mongo le fait par défaut. Et pour répondre à la question, vous pouvez faire quelque chose comme :

const compareDate = new Date("1/2/2013").toISOString()
const baseDate = new Date("11/1/2012").toISOString()

function isLater(string1, string2) {
    return string1 > string2
}

isLater(compareDate, baseDate)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X