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?
Réponses
Trop de publicités?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!");
}
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.
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.
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)
- Réponses précédentes
- Plus de réponses