2689 votes

Comparer les dates avec JavaScript

Quelqu'un peut-il suggérer une façon de comparer les valeurs des deux dates de supérieures à, inférieur et non dans le passé à l’aide de javascript ? Les valeurs fera son apparition de zones de texte.

3217voto

moonshadow Points 28302

L' objet Date fera ce que vous voulez - construisez-en un pour chaque date, puis comparez-les en utilisant les opérateurs habituels.

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

522voto

Daniel Lidström Points 2970

Comparez < et > comme d'habitude, mais tout ce qui implique = devrait 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!

487voto

some Points 18965

Le moyen le plus facile de comparer des dates en javascript est d'abord le convertir en un objet Date, puis de comparer ces jour-objets.

Vous trouverez ci-dessous un objet à trois fonctions:

  • des dates.comparer(a,b)

    Renvoie un nombre:

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

    Retourne un booléen ou NaN:

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

    Utilisé par les autres fonctions de convertir leur entrée à un objet date. L'entrée peut être

    • une date-objet : L'entrée est rendu comme tel.
    • un tableau: Interprété comme [jour,mois,année]. NOTE de 0 à 11 mois est.
    • un nombre : Interprétée comme le nombre de millisecondes depuis le 1er janvier 1970 (timestamp)
    • une chaîne de caractères : Plusieurs formats différents est pris en charge, comme "YYYY/MM/DD", "MM/DD/YYYY", "31 Jan 2009", etc.
    • un objet: Interprétée comme un objet avec l'année, le mois et la date attributs. NOTE de 0 à 11 mois est.

.

// 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
        );
    }
}

Mis à jour le 26 Février 2011 avec la documentation dans le code (le code est modification).

201voto

Salman A Points 60620

Deux JavaScript Date d'objets peuvent être comparées à l'aide d' < et >:

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

Mais vous ne pouvez pas utiliser == et === parce que:

  • Deux objets distincts ne sont jamais égaux, soit strictement ou le résumé des comparaisons
  • Une expression Objets de comparaison n'est vrai que si les opérandes de référence au même Objet

Cependant, les valeurs contenues dans JavaScript Dates peuvent être comparés pour l'égalité:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
d1 == d2;                     // false
d1 === d2;                    // false
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1) == Number(d2);     // true

102voto

Peter Wilkinson Points 2228

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

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

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

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