Comparez deux dates avec JavaScript



Answers

Le moyen le plus simple de comparer les dates en javascript consiste à le convertir en un objet Date, puis à comparer ces objets-date.

Ci-dessous vous trouvez un objet avec trois fonctions:

  • dates.compare (a, b)

    Renvoie un nombre:

    • -1 si un <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 un 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 des dates sont illégales.
  • dates.convert

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

    • un objet- date : l'entrée est renvoyée telle quelle.
    • un tableau : Interprété comme [année, mois, jour]. NOTE Le mois est 0-11.
    • un nombre : Interprété en nombre de millisecondes depuis le 1er janvier 1970 (un horodatage)
    • une chaîne : Plusieurs formats différents sont supportés, comme "AAAA / MM / JJ", "MM / JJ / AAAA", "31 janvier 2009" etc.
    • un objet : Interprété comme un objet avec des attributs d'année, de mois et de date. NOTE 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
        );
    }
}
Question

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




Méfiez-vous du 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 les chaînes dans le fuseau horaire "local". Si vous voulez utiliser des dates avec des 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. Ceci est une convention commune 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 voulez que votre date reflète le fuseau horaire de l'utilisateur. Cliquez si aujourd'hui c'est votre anniversaire . Les utilisateurs de la Nouvelle-Zélande et des É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()));

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

Ayant pris soin de gérer le fuseau horaire lorsque vous créez, vous devez également être sûr de garder le fuseau horaire lorsque vous revenez à une représentation de chaîne. Ainsi, vous pouvez 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()



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

Il suffit de suivre ces étapes pour comparer la valeur de 2 dates, par exemple vous avez 2 entrées dont chacune a une valeur Date dans String et vous permet de les comparer ...

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

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

2. Ils doivent être Date Object pour être comparés en tant que valeurs de date, il suffit donc de les convertir en date, en utilisant new Date() , je les réattribue juste pour la simplicité d'explication, mais vous pouvez le faire quand vous voulez:

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

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

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




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



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érifie si le numéro 20121121 est supérieur à 20121103 ou non.




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




RÉPONSE COURTE

Voici une fonction qui retourne {boolean} si le de dateTime> à dateTime Demo 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 à la fois datetime dans le type de numéro, vous pouvez les comparer avec des opérations de comparaison

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

alors

Si vous êtes familier avec C# Custom Date et heure Format String cette bibliothèque devrait faire exactement la même chose et vous aider à formater votre date et heure dtmFRM si vous passez en format date ou chaîne 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 un de ces formats pacifié dans le fichier de la bibliothèque js




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 vous recommande d'utiliser des sélections de date ou un sélecteur de date comme le contrôle de calendrier YUI ou l' interface utilisateur jQuery Datepicker .

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




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

function areSameDate(d1, d2){
    return d1 - d2 === 0
}



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

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



Comparer le jour seulement (en ignorant le composant 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
}



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

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







Salut Voici mon code pour comparer les dates. Dans mon cas je fais un chèque pour ne pas permettre de choisir des dates passées.

var myPickupDate = <pick up date> ;
var isPastPickupDateSelected = false;
var currentDate = new Date();

if(currentDate.getFullYear() <= myPickupDate.getFullYear()){
    if(currentDate.getMonth()+1 <= myPickupDate.getMonth()+1 || currentDate.getFullYear() < myPickupDate.getFullYear()){
                        if(currentDate.getDate() <= myPickupDate.getDate() || currentDate.getMonth()+1 < myPickupDate.getMonth()+1 || currentDate.getFullYear() < myPickupDate.getFullYear()){
                                            isPastPickupDateSelected = false;
                                            return;
                                        }
                    }
}
console.log("cannot select past pickup date");
isPastPickupDateSelected = true;



Les opérateurs relationnels <= > >= peuvent être utilisés pour comparer les 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 des) dates because :

  • Deux objets distincts ne sont jamais égaux pour des comparaisons strictes ou abstraites.
  • Une expression comparant les 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é en utilisant l'une des méthodes suivantes:

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

Date.getTime() et Date.valueOf() renvoient le nombre de millisecondes Date.valueOf() depuis le 1er janvier 1970 à 00:00 UTC. La fonction Number et l'opérateur unary + appellent les méthodes valueOf() derrière les scènes.




Related