Comparez deux dates avec JavaScript

1953

Quelqu'un peut-il suggérer un moyen de comparer les valeurs de deux dates supérieures à, inférieures à et non dans le passé en utilisant JavaScript? Les valeurs proviendront des zones de texte.

Alex
la source
17
En ce qui concerne DateTime et la manipulation dans JS, je ne regarde pas plus loin que momentjs :)
Halceyon
47
pas besoin d'utiliser momentjs pour comparer 2 dates. Utilisez simplement l'objet Date de javascript pur. Vérifiez la réponse principale pour plus de détails.
Lukas Liesis
Vous pouvez vous référer à la réponse suivante: stackoverflow.com/questions/4812152/… Vérifiez getDateDifference et getDifferenceInDays si cela peut vous aider.
Vikash Rajpurohit
Je vais vous donner une raison de regarder plus loin que Moment.js ( que j'aime, MAIS ... ): Ne pas utiliser pour boucler des charges
Geek Stocks
Pour une fonction utile pour séparer le décalage horaire en unités (secondes, minutes, heures, etc.), voir la réponse sur stackoverflow.com/questions/1968167/… . Cette réponse est désormais également disponible sur stackoverflow.com/a/46529159/3787376 .
Edward

Réponses:

2286

L' objet Date fera ce que vous voulez - construire un pour chaque date, puis de les comparer en utilisant la >, <, <=ou >=.

Le ==, !=, ===, et les !==opérateurs vous obligent à utiliser date.getTime()comme

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

pour être clair, il suffit de vérifier l'égalité directement avec les objets de date ne fonctionnera pas

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

Je vous suggère d'utiliser des listes déroulantes ou une forme similaire de saisie de date plutôt que des zones de texte, de peur de vous retrouver dans l'enfer de la validation des entrées.

l'ombre de la lune
la source
64
Même la méthode d'Ace n'est pas infaillible. Vous devez d'abord réinitialiser les millisecondes, et vous pouvez même vouloir réinitialiser tout le temps. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); Cela combiné à l'utilisation de .getTime () vous donnera un résultat de comparaison précis
patrick
102
@patrick, suggérez d'appeler de setHours(0,0,0,0)cette façon. Élimine le besoin d'appeler, setMinutes()etc. Exécute également plus rapidement.
Karl
26
en évitant == ou === pour obtenir le résultat souhaité: jsfiddle.net/P4y5J maintenant> = anotherNow && now <= anotherNow IS true FYI
Jason Sebring
5
Pourquoi ne pas simplement utiliser la toString()méthode aux deux dates et comparer ensuite avec l' ==opérateur? Semble beaucoup plus facile que de réinitialiser l'heure et de comparer ensuite, y a-t-il des inconvénients à cela?
user2019515
13
Vous pouvez également comparer les valeurs numériques de vos dates afin d'éviter de comparer les objets eux-mêmes: date1.valueOf () == date2.valueOf ()
madprog
421

Le moyen le plus simple de comparer des dates en javascript est de le convertir d'abord en objet Date, puis de comparer ces objets de date.

Ci-dessous vous trouvez un objet avec trois fonctions:

  • dates.compare (a, b)

    Renvoie un nombre:

    • -1 si a <b
    • 0 si a = b
    • 1 si a> b
    • NaN si a ou b est une date illégale
  • dates.inRange (d, début, fin)

    Renvoie un booléen ou NaN:

    • vrai si d est entre le début et la fin (inclus)
    • false si d est avant le début ou après la fin .
    • NaN si une ou plusieurs dates sont illégales.
  • dates.convert

    Utilisé par les autres fonctions pour convertir leur entrée en objet date. L'entrée peut être

    • a date -object: L'entrée est retournée telle quelle.
    • un tableau : interprété comme [année, mois, jour]. REMARQUE le mois est 0-11.
    • un nombre : interprété comme un nombre de millisecondes depuis le 1er janvier 1970 (horodatage)
    • une chaîne : plusieurs formats différents sont pris en charge, comme "AAAA / MM / JJ", "MM / JJ / AAAA", "31 janvier 2009", etc.
    • un objet : interprété comme un objet avec des attributs année, mois et date. REMARQUE le mois est 0-11.

.

// Source: http://stackoverflow.com/questions/497790
var dates = {
    convert:function(d) {
        // Converts the date in d to a date-object. The input can be:
        //   a date object: returned without modification
        //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
        //   a number     : Interpreted as number of milliseconds
        //                  since 1 Jan 1970 (a timestamp) 
        //   a string     : Any format supported by the javascript engine, like
        //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
        //  an object     : Interpreted as an object with year, month and date
        //                  attributes.  **NOTE** month is 0-11.
        return (
            d.constructor === Date ? d :
            d.constructor === Array ? new Date(d[0],d[1],d[2]) :
            d.constructor === Number ? new Date(d) :
            d.constructor === String ? new Date(d) :
            typeof d === "object" ? new Date(d.year,d.month,d.date) :
            NaN
        );
    },
    compare:function(a,b) {
        // Compare two dates (could be of any type supported by the convert
        // function above) and returns:
        //  -1 : if a < b
        //   0 : if a = b
        //   1 : if a > b
        // NaN : if a or b is an illegal date
        // NOTE: The code inside isFinite does an assignment (=).
        return (
            isFinite(a=this.convert(a).valueOf()) &&
            isFinite(b=this.convert(b).valueOf()) ?
            (a>b)-(a<b) :
            NaN
        );
    },
    inRange:function(d,start,end) {
        // Checks if date in d is between dates in start and end.
        // Returns a boolean or NaN:
        //    true  : if d is between start and end (inclusive)
        //    false : if d is before start or after end
        //    NaN   : if one or more of the dates is illegal.
        // NOTE: The code inside isFinite does an assignment (=).
       return (
            isFinite(d=this.convert(d).valueOf()) &&
            isFinite(start=this.convert(start).valueOf()) &&
            isFinite(end=this.convert(end).valueOf()) ?
            start <= d && d <= end :
            NaN
        );
    }
}
certains
la source
11
(a > b) - (a < b)est utile pour trier le tableau des dates
nktssh
@nikita Oui, et une fonction qui retourne ce résultat peut être utilisée Array.prototype.sorttant que toutes les valeurs sont des dates valides. S'il pourrait y avoir des dates non valides, je recommande d' utiliser quelque chose commefunction ( a, b ) { a = a === undefined || a === null : NaN : a.valueOf( a ); b = a === undefined || b === null : NaN : a.valueOf( b ); return isFinite( a ) && isFinite( b ) ? ( a > b ) - ( a < b ) : NaN; }
certains
4
@ nktssh — peut-être, mais il return a - best plus simple et remplace l'intégralité de l'instruction return.
RobG
284

Comparez <et >comme d'habitude, mais tout ce qui implique =doit utiliser un +préfixe. Ainsi:

var x = new Date('2013-05-23');
var y = new Date('2013-05-23');

// less than, greater than is fine:
x < y; => false
x > y; => false
x === y; => false, oops!

// anything involving '=' should use the '+' prefix
// it will then compare the dates' millisecond values
+x <= +y;  => true
+x >= +y;  => true
+x === +y; => true

J'espère que cela t'aides!

Daniel Lidström
la source
81
terriblement lent :) Je préfère la x.getTime() === y.getTime()méthode, à la fois lisible et extrêmement rapide voir jsperf
huysentruitw
24
L' +opérateur tente de convertir l'expression en un nombre. Date.valueOf()est utilisé pour la conversion (qui renvoie la même chose que Date.getTime().
Salman A
13
@WouterHuysentruit Les deux sont très rapides (> 3 millions d'OPS dans le navigateur le plus lent). Utilisez la méthode que vous pensez être plus lisible
Eloims
13
Notez que tout ce qui implique «=» doit utiliser la partie préfixe «+» de votre réponse est incorrect. <, <=, >Et >=utiliser le même algorithme ( algorithme de comparaison abstraite relationnelle ) dans les coulisses.
Salman A
2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Grâce à votre réponse, le service que je développe au travail avait un terrible bug qui était difficile à suivre.
Gyuhyeon Lee
157

Les opérateurs relationnels < <= > >=peuvent être utilisés pour comparer des dates JavaScript:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 2);
d1 <  d2; // true
d1 <= d2; // true
d1 >  d2; // false
d1 >= d2; // false

Cependant, les opérateurs d'égalité == != === !==ne peuvent pas être utilisés pour comparer (la valeur de) les dates car :

  • Deux objets distincts ne sont jamais égaux pour des comparaisons strictes ou abstraites.
  • Une expression comparant des objets n'est vraie que si les opérandes font référence au même objet.

Vous pouvez comparer la valeur des dates pour l'égalité à l'aide de l'une de ces méthodes:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
/*
 * note: d1 == d2 returns false as described above
 */
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1)   == Number(d2);   // true
+d1          == +d2;          // true

Les deux Date.getTime()et Date.valueOf()retournent le nombre de millisecondes depuis le 1er janvier 1970 à 00h00 UTC. La Numberfonction et l' +opérateur unaire appellent les valueOf()méthodes dans les coulisses.

Salman A
la source
Est-il sûr de convertir l'objet String en date? Cela ne peut-il pas lever l'exception ou donner des résultats peu fiables? Quel peut être le moyen le plus fiable de faire des dates similaires dans JS? Lorsque vous dites des résultats peu fiables, cette méthode peut-elle donner des valeurs différentes / erronées même lorsque nous sommes sûrs que le format de la date ne changera pas -> Ce serait "jeudi 10 août 2017". Votre aide ici est très appréciée.
user2696258
Cela peut-il donner des résultats peu fiables pour la même valeur de date sur différents OS / navigateurs / appareils?
user2696258
1
@ user2696258 c'est la manière la plus fiable de comparer deux objets Date . La conversion d'une chaîne en date est un problème différent ... utilisez une bibliothèque d'analyse de date ou lancez votre propre solution. Thursday, 10 Aug 2017est un format non standard et différents navigateurs peuvent l'analyser différemment, ou ne pas l'analyser du tout. Voir les notes sur Date.parse.
Salman A du
88

La méthode de loin la plus simple consiste à soustraire une date de l'autre et à comparer le résultat.

var oDateOne = new Date();
var oDateTwo = new Date();

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);

Peter Wilkinson
la source
68

En comparant les dates en JavaScript est assez facile ... JavaScript a intégré le système de comparaison pour les dates qui le rend si facile à faire la comparaison ...

Suivez simplement ces étapes pour comparer la valeur de 2 dates, par exemple vous avez 2 entrées qui ont chacune une valeur de date Stringet vous pour les comparer ...

1. vous avez 2 valeurs de chaîne que vous obtenez à partir d'une entrée et vous souhaitez les comparer, elles sont comme ci-dessous:

var date1 = '01/12/2018';
var date2 = '12/12/2018';

2. Ils doivent Date Objectêtre comparés en tant que valeurs de date, alors convertissez-les simplement en date, en utilisant new Date(), je les réattribue simplement pour des raisons d'explication, mais vous pouvez le faire comme vous le souhaitez:

date1 = new Date(date1);
date2 = new Date(date2);

3. Maintenant, comparez-les simplement en utilisant> < >= <=

date1 > date2;  //false
date1 < date2;  //true
date1 >= date2; //false
date1 <= date2; //true

comparer les dates en javascript

Alireza
la source
J'ai trouvé que la plupart des solutions pour comparer les dates fonctionnent dans n'importe quel navigateur. Le problème que j'ai rencontré concernait IE. Cette solution a fonctionné dans tous les domaines. Thx Alireza!
Joshua Oglesbee
2
Ça ne marche pas. Et ça ne devrait pas marcher. Vous comparez un objet de date.
maxisam
3
@maxisam Non, il ne fonctionne pas à cause des opérateurs de comparaison ( <, >, <=, >=) utilisé, les objets de date sont d' abord converties époque unix (secondes), et il fonctionne très bien. Cependant, cela pourrait conduire à l'erreur courante de faire date1 == date2où en effet une erreur est introduite comme non la valeur mais l'égalité d'instance est vérifiée. Pour éviter cela et vérifier l'égalité de la valeur de date cela fonctionnerait: date1.valueOf() == date2.valueOf(), ou moinsdate1+0 == date2+0
humanityANDpeace
Note de MDN Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies. et Note: Parsing of date strings with the Date constructor (and Date.parse, they are equivalent) is strongly discouraged due to browser differences and inconsistencies.
AaA
35

Comparer uniquement le jour (en ignorant la composante temps):

Date.prototype.sameDay = function(d) {
  return this.getFullYear() === d.getFullYear()
    && this.getDate() === d.getDate()
    && this.getMonth() === d.getMonth();
}

Usage:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}
mpen
la source
c'est bon. mais si je compare nextDay ou previousDay. j'ai essayé cette Date.prototype.nextDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); } mais cela ne fonctionnera que ce mois-ci. comment puis-je comparer au cours du mois ou des années
Paresh3489227
32

quel format?

Si vous construisez un objet Javascript Date , vous pouvez simplement les soustraire pour obtenir une différence de quelques millisecondes (modifier: ou simplement les comparer):

js>t1 = new Date()
Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time)
js>t2 = new Date()
Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time)
js>t2-t1
2672
js>t3 = new Date('2009 Jan 1')
Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)
js>t1-t3
2470768442
js>t1>t3
true
Jason S
la source
1
La soustraction est une bonne idée car elle évite le ==problème de comparaison mentionné ci-dessus.
devios1
Quel JavaScript REPL utilisez-vous?
hyde
JSDB - voir jsdb.org - Je l'utilise moins souvent ces jours-ci maintenant que Python est mon langage de choix, mais c'est toujours un excellent utilitaire.
Jason S
1
@ StuartP.Bentley Je ne sais pas, car je n'en utilise aucun. J'utilise jsdb.
Jason S
lorsque vous parcourez une grande quantité de dates, cela semble plus efficace car il n'est pas nécessaire de convertir avec getTime ().
pcarvalho
16

vous utilisez ce code,

var firstValue = "2012-05-12".split('-');
var secondValue = "2014-07-12".split('-');

 var firstDate=new Date();
 firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]);

 var secondDate=new Date();
 secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]);     

  if (firstDate > secondDate)
  {
   alert("First Date  is greater than Second Date");
  }
 else
  {
    alert("Second Date  is greater than First Date");
  }

Et vérifiez également ce lien http://www.w3schools.com/js/js_obj_date.asp

rester affamé
la source
3
Une raison de ne pas faire référence à W3Schools: w3fools.com - bonne solution cependant - est-il conforme aux normes et fonctionne-t-il dans tous les navigateurs?
Mathias Lykkegaard Lorenzen
1
Mieux vaut se référer au Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
Daniel Lidström
16

RÉPONSE COURTE

Voici une fonction qui retourne {boolean} si la démo from dateTime> to dateTime en action

var from = '08/19/2013 00:00'
var to = '08/12/2013 00:00 '

function isFromBiggerThanTo(dtmfrom, dtmto){
   return new Date(dtmfrom).getTime() >=  new Date(dtmto).getTime() ;
}
console.log(isFromBiggerThanTo(from, to)); //true

Explication

jsFiddle

var date_one = '2013-07-29 01:50:00',
date_two = '2013-07-29 02:50:00';
//getTime() returns the number of milliseconds since 01.01.1970.
var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 
console.log(typeof timeStamp_date_one);//number 
var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 
console.log(typeof timeStamp_date_two);//number 

puisque vous avez maintenant les deux datetime dans le type de nombre, vous pouvez les comparer avec toutes les opérations de comparaison

(>, <, =,! =, ==,! ==,> = ET <=)

alors

Si vous connaissez la C#chaîne de format de date et d'heure personnalisée, cette bibliothèque devrait faire exactement la même chose et vous aider à formater votre date et heure dtmFRM, que vous passiez une chaîne de date et d'heure ou un format Unix.

Usage

var myDateTime = new dtmFRM();

alert(myDateTime.ToString(1375077000000, "MM/dd/yyyy hh:mm:ss ampm"));
//07/29/2013 01:50:00 AM

alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd"));
//this year is 2013 and the day is Monday

alert(myDateTime.ToString('1/21/2014', "this month is MMMM and the day is dd"));
//this month is january and the day is 21

DEMO

tout ce que vous avez à faire est de passer l'un de ces formats pacifiés dans le jsfichier de bibliothèque

Mina Gabriel
la source
new Date (dtmfrom)> = new Date (dtmto) est beaucoup plus lent que new Date (dtmfrom) .getTime ()> = new Date (dtmto) .getTime ()
Mina Gabriel
Peut-être, mais la différence est d'environ 30 à 120 nanosecondes (disons 0,000000075 secondes) par opération, selon le navigateur, donc pas vraiment significative.
RobG
16

La manière simple est,

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}
MICHAEL PRABHU
la source
14

Remarque - Comparer uniquement la date:

Lorsque nous comparons deux dates en javascript. Cela prend des heures, des minutes et des secondes également à prendre en compte. Donc, si nous devons seulement comparer la date seulement, voici l'approche:

var date1= new Date("01/01/2014").setHours(0,0,0,0);

var date2= new Date("01/01/2014").setHours(0,0,0,0);

Maintenant: if date1.valueOf()> date2.valueOf()fonctionnera comme un charme.

Sanjeev Singh
la source
13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

la source
1
Quel est leur type de a ou b? Rendez-vous? Quel format? Cela ne semble pas fonctionner avec moi.
Luci
5
en supposant aet en bétant des Dateobjets que vous pouvez également utiliserreturn a*1 == b*1;
Udo G
4
@UdoG: Plus court:+a == +b
mpen
13
var date = new Date(); // will give you todays date.

// following calls, will let you set new dates.
setDate()   
setFullYear()   
setHours()  
setMilliseconds()   
setMinutes()    
setMonth()  
setSeconds()    
setTime()

var yesterday = new Date();
yesterday.setDate(...date info here);

if(date>yesterday)  // will compare dates
Narendra Kamma
la source
11

Juste pour ajouter encore une autre possibilité aux nombreuses options existantes, vous pouvez essayer:

if (date1.valueOf()==date2.valueOf()) .....

... qui semble fonctionner pour moi. Bien sûr, vous devez vous assurer que les deux dates ne sont pas indéfinies ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

De cette façon, nous pouvons nous assurer qu'une comparaison positive est faite si les deux ne sont pas définis également, ou ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

... si vous préférez qu'ils ne soient pas égaux.

Paul
la source
11

Via Moment.js

Jsfiddle: http://jsfiddle.net/guhokemk/1/

function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

La méthode renvoie 1 si dateTimeAest supérieur àdateTimeB

La méthode renvoie 0 si dateTimeAégal àdateTimeB

La méthode renvoie -1 si dateTimeAest inférieur àdateTimeB

Razan Paul
la source
3
Il n'est pas nécessaire d'utiliser une bibliothèque externe telle que Moment pour effectuer une comparaison de date pour les Dateobjets.
amb
Le moment était absolument nécessaire pour mon cas d'utilisation. Merci, Razan!
razorsyntax
2
pourquoi utilisez-vous même des opérateurs <ou >alors que le moment est déjà venu avec des méthodes de comparaison pratiques telles que .isBeforeet .isAfter, tout est dans la documentation
svarog
10

ATTENTION À LA FUSEAU HORAIRE

Une date javascript n'a aucune notion de fuseau horaire . C'est un moment dans le temps (ticks depuis l'époque) avec des fonctions pratiques pour traduire vers et depuis des chaînes dans le fuseau horaire "local". Si vous souhaitez travailler avec des dates à l'aide d'objets de date, comme tout le monde ici, vous voulez que vos dates représentent UTC à minuit au début de la date en question. Il s'agit d'une convention courante et nécessaire qui vous permet de travailler avec des dates indépendamment de la saison ou du fuseau horaire de leur création. Vous devez donc être très vigilant pour gérer la notion de fuseau horaire, en particulier lorsque vous créez votre objet Date UTC à minuit.

La plupart du temps, vous souhaiterez que votre date reflète le fuseau horaire de l'utilisateur. Cliquez si aujourd'hui est votre anniversaire . Les utilisateurs en NZ et aux États-Unis cliquent en même temps et obtiennent des dates différentes. Dans ce cas, faites ceci ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

Parfois, la comparabilité internationale l'emporte sur la précision locale. Dans ce cas, faites ceci ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));

Vous pouvez maintenant comparer directement vos objets de date comme le suggèrent les autres réponses.

Après avoir pris soin de gérer le fuseau horaire lors de la création, vous devez également vous assurer de ne pas afficher le fuseau horaire lors de la reconversion en une représentation sous forme de chaîne. Vous pouvez donc utiliser en toute sécurité ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

Et évitez totalement tout le reste, surtout ...

  • getYear(), getMonth(),getDate()
bbsimonbb
la source
8

Supposons que vous ayez les objets de date A et B, obtenez leur valeur de temps EPOC, puis soustrayez pour obtenir la différence en millisecondes.

var diff = +A - +B;

C'est tout.

foobar
la source
8

Pour comparer deux dates, nous pouvons utiliser la bibliothèque JavaScript date.js qui se trouve à l' adresse : https://code.google.com/archive/p/datejs/downloads

et utilisez la Date.compare( Date date1, Date date2 )méthode et elle renvoie un nombre qui signifie le résultat suivant:

-1 = date1 est inférieure à date2.

0 = les valeurs sont égales.

1 = date1 est supérieure à date2.

Salahin Rocky
la source
8

Soustrayez deux dates pour obtenir la différence en millisecondes, si vous obtenez 0c'est la même date

function areSameDate(d1, d2){
    return d1 - d2 === 0
}
Yukulélé
la source
7

Afin de créer des dates à partir de texte libre en Javascript, vous devez l'analyser dans l'objet Date ().

Vous pouvez utiliser Date.parse () qui prend du texte libre essaie de le convertir en une nouvelle date, mais si vous avez le contrôle sur la page, je recommanderais d'utiliser des zones de sélection HTML à la place ou un sélecteur de date tel que le contrôle du calendrier YUI ou l' interface utilisateur jQuery Datepicker .

Une fois que vous avez une date, comme d'autres l'ont souligné, vous pouvez utiliser une simple arithmétique pour soustraire les dates et la reconvertir en nombre de jours en divisant le nombre (en secondes) par le nombre de secondes dans une journée (60 * 60 * 24 = 86400).

sh1mmer
la source
6
var date_today=new Date();
var formated_date = formatDate(date_today);//Calling formatDate Function

var input_date="2015/04/22 11:12 AM";

var currentDateTime = new Date(Date.parse(formated_date));
var inputDateTime   = new Date(Date.parse(input_date));

if (inputDateTime <= currentDateTime){
    //Do something...
}

function formatDate(date) {
    var hours = date.getHours();
    var minutes = date.getMinutes();
    var ampm = hours >= 12 ? 'PM' : 'AM';

    hours = hours % 12;
    hours = hours ? hours : 12; // the hour '0' should be '12'
    hours   = hours < 10 ? '0'+hours : hours ;

    minutes = minutes < 10 ? '0'+minutes : minutes;

    var strTime = hours+":"+minutes+ ' ' + ampm;
    return  date.getFullYear()+ "/" + ((date.getMonth()+1) < 10 ? "0"+(date.getMonth()+1) :
    (date.getMonth()+1) ) + "/" + (date.getDate() < 10 ? "0"+date.getDate() :
    date.getDate()) + " " + strTime;
}
vickisys
la source
5

Une version améliorée du code posté par "certains"

/* Compare the current date against another date.
 *
 * @param b  {Date} the other date
 * @returns   -1 : if this < b
 *             0 : if this === b
 *             1 : if this > b
 *            NaN : if a or b is an illegal date
*/ 
Date.prototype.compare = function(b) {
  if (b.constructor !== Date) {
    throw "invalid_date";
  }

 return (isFinite(this.valueOf()) && isFinite(b.valueOf()) ? 
          (this>b)-(this<b) : NaN 
        );
};

usage:

  var a = new Date(2011, 1-1, 1);
  var b = new Date(2011, 1-1, 1);
  var c = new Date(2011, 1-1, 31);
  var d = new Date(2011, 1-1, 31);

  assertEquals( 0, a.compare(b));
  assertEquals( 0, b.compare(a));
  assertEquals(-1, a.compare(c));
  assertEquals( 1, c.compare(a));
Rodrigo Pinho Pereira de Souza
la source
On suppose que a est l'instance Date à laquelle la méthode est appelée. Dans quel cas une date peut -elle être invalide, mais toujours une instance de date?
RobG
5

Si votre format de date est le suivant, vous pouvez utiliser ce code:

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

Il vérifiera si le 20121121nombre est supérieur 20121103ou non.

totten
la source
4
S'il est déjà au format ISO8601 (AAAA-MM-JJ), vous n'avez pas besoin de supprimer de caractères ni de le convertir en entier. Il suffit de comparer les cordes first == secondou first < secondou first > second. C'est l'une des nombreuses beautés avec ISO8601 par rapport à MM / DD / YY, DD / MM / YY, YY / DD / MM, DD / YY / MM ou MM / YY / DD.
certains
5

Je stocke généralement Datescomme timestamps(Number)dans les bases de données.

Quand j'ai besoin de comparer, je compare simplement entre ces horodatages ou

convertissez-le en objet de date et comparez-le > <si nécessaire.

Notez que == ou === ne fonctionne pas correctement sauf si vos variables sont des références du même objet Date.

Convertissez d'abord ces objets Date en horodatage (nombre), puis comparez leur égalité.


Date à l'horodatage

var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00
var timestamp = new Date().getTime(); // Current Timestamp

Horodatage à ce jour

var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);
jwchang
la source
C'est la meilleure réponse - et la plus rapide jsperf.com/comparing-date-objects
Scott Stensland
3

Avant de comparer l' Datesobjet, essayez de mettre leurs deux millisecondes à zéro comme Date.setMilliseconds(0);.

Dans certains cas où l' Dateobjet est créé dynamiquement en javascript, si vous continuez à imprimer le Date.getTime(), vous verrez les millisecondes changer, ce qui empêchera l'égalité des deux dates.

Júlio Paulillo
la source
3

Performance

Aujourd'hui 2020.02.27 j'effectue des tests des solutions choisies sur Chrome v80.0, Safari v13.0.5 et Firefox 73.0.1 sur MacOs High Sierra v10.13.6

Conclusions

  • les solutions d1==d2(D) et d1===d2(E) sont les plus rapides pour tous les navigateurs
  • la solution getTime(A) est plus rapide que valueOf(B) (les deux sont moyennement rapides)
  • les solutions F, L, N sont les plus lentes pour tous les navigateurs

entrez la description de l'image ici

Détails

Les solutions d'extraits de code utilisées dans les tests de performances sont présentées ci-dessous. Vous pouvez effectuer un test sur votre machine ICI

Résultats pour chrome

entrez la description de l'image ici

Kamil Kiełczewski
la source
Mais d1==d2ou d1===d2est inutile dans le contexte de la question.
TheMaster
1
        from_date ='10-07-2012';
        to_date = '05-05-2012';
        var fromdate = from_date.split('-');
        from_date = new Date();
        from_date.setFullYear(fromdate[2],fromdate[1]-1,fromdate[0]);
        var todate = to_date.split('-');
        to_date = new Date();
        to_date.setFullYear(todate[2],todate[1]-1,todate[0]);
        if (from_date > to_date ) 
        {
            alert("Invalid Date Range!\nStart Date cannot be after End Date!")

            return false;
        }

Utilisez ce code pour comparer la date à l'aide de javascript.

Merci D.Jeeva

Jeeva
la source
Je pense que c'est une bonne réponse car nous avons le format "jj / mm / aa" et nous devons le faire pour comparer les deux dates. Je ne sais pas si c'est la meilleure réponse mais c'est suffisant. Merci pour le partage.
danigonlinea
1
var curDate=new Date();
var startDate=document.forms[0].m_strStartDate;

var endDate=document.forms[0].m_strEndDate;
var startDateVal=startDate.value.split('-');
var endDateVal=endDate.value.split('-');
var firstDate=new Date();
firstDate.setFullYear(startDateVal[2], (startDateVal[1] - 1), startDateVal[0]);

var secondDate=new Date();
secondDate.setFullYear(endDateVal[2], (endDateVal[1] - 1), endDateVal[0]);
if(firstDate > curDate) {
    alert("Start date cannot be greater than current date!");
    return false;
}
if (firstDate > secondDate) {
    alert("Start date cannot be greater!");
    return false;
}
user1931504
la source
1

Voici ce que j'ai fait dans l'un de mes projets,

function CompareDate(tform){
     var startDate = new Date(document.getElementById("START_DATE").value.substring(0,10));
     var endDate = new Date(document.getElementById("END_DATE").value.substring(0,10));

     if(tform.START_DATE.value!=""){
         var estStartDate = tform.START_DATE.value;
         //format for Oracle
         tform.START_DATE.value = estStartDate + " 00:00:00";
     }

     if(tform.END_DATE.value!=""){
         var estEndDate = tform.END_DATE.value;
         //format for Oracle
         tform.END_DATE.value = estEndDate + " 00:00:00";
     }

     if(endDate <= startDate){
         alert("End date cannot be smaller than or equal to Start date, please review you selection.");
         tform.START_DATE.value = document.getElementById("START_DATE").value.substring(0,10);
         tform.END_DATE.value = document.getElementById("END_DATE").value.substring(0,10);
         return false;
     }
}

appelant ceci sur le formulaire onsubmit. J'espère que cela t'aides.

Brijesh
la source