web-dev-qa-db-fra.com

Comparer la partie de date uniquement sans comparer le temps en JavaScript

Quel est le problème avec le code ci-dessous?

Peut-être serait-il plus simple de comparer la date et non l'heure. Je ne suis pas sûr de savoir comment faire cela non plus, et j'ai cherché, mais je n'ai pas pu trouver mon problème exact.

BTW, quand je montre les deux dates dans une alerte, elles montrent exactement les mêmes.

Mon code:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

Existe-t-il un moyen plus simple de comparer les dates sans inclure l'heure?

305
moleculezz

J'apprends encore le JavaScript et la seule façon pour moi de comparer deux dates sans l'heure consiste à utiliser la méthode setHours de l'objet Date et à définir les heures, minutes, secondes et millisecondes à zéro. Ensuite, comparez les deux dates.

Par exemple,

date1 = new Date()
date2 = new Date(2011,8,20)

date2 sera mis à zéro avec les heures, les minutes, les secondes et les millisecondes, mais date1 sera réglé sur l'heure à laquelle cette date1 a été créée. Pour supprimer les heures, les minutes, les secondes et les millisecondes à la date1, procédez comme suit:

date1.setHours(0,0,0,0)

Vous pouvez désormais comparer les deux dates en tant que DATES sans vous soucier d'éléments temporels.

665
nexar

Que dis-tu de ça? 

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

Cela vous permet de comparer la partie de date de la date comme ceci sans affecter la valeur de votre variable:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true
61
AdEpt

Utiliser Moment.js

Si vous avez la possibilité d'inclure une bibliothèque tierce, il vaut vraiment la peine de jeter un coup d'œil à Moment.js . Il est beaucoup plus facile de travailler avec Date et DateTime.

Par exemple, si une date vient après une autre date mais en excluant leur heure, vous feriez quelque chose comme ceci:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

Le deuxième paramètre que vous entrez dans isAfter est la précision de la comparaison et peut être l'un des year, month, week, day, hour, minute ou second.

17
Joshua Pinter

Comparez simplement en utilisant .toDateString comme ci-dessous:

new Date().toDateString();

Cela vous renverra une partie de la date seulement et pas l'heure ou le fuseau horaire, comme ceci:

"Vendredi 03 février 2017"

Par conséquent, les deux dates peuvent être comparées dans ce format sans aucune partie de temps.

9
Rahi

Cela pourrait être une version un peu plus propre, notez également que vous devez toujours utiliser une base lorsque vous utilisez parseInt.

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

Consultez la page MDC parseInt pour plus d’informations sur la base.

JSLint est un excellent outil pour détecter des éléments tels qu'une base manquante et de nombreux autres éléments susceptibles de générer des erreurs obscures et difficiles à corriger. Cela vous oblige à utiliser de meilleures normes de codage afin d'éviter de futurs maux de tête. Je l'utilise sur tous les projets JavaScript que je code.

8
Useless Code

La bibliothèque date.js est pratique pour ces choses. Cela rend tous les scripts JS liés à la date beaucoup plus faciles.

C'est comme ça que je le fais:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}
3
Fabrizio

Comme je ne vois pas ici d’approche similaire, et je n’apprécie pas de définir h/m/s/ms sur 0, car cela peut poser des problèmes de transition précise vers le fuseau horaire avec un objet date modifié (je suppose donc), Je présente ici ceci, écrit il ya quelques instants, lil fonction:

+: Facile à utiliser, permet d'effectuer des opérations de comparaison de base (comparant jour, mois et année sans heure.)
-: Il semble que ce soit tout le contraire de la pensée "out of the box".

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

Usage:

datecompare(date1, '===', date2) pour le contrôle d'égalité,
datecompare(date1, '>', date2) pour plus de vérification,
!datecompare(date1, '>', date2) pour un contrôle inférieur ou égal 

En outre, vous pouvez évidemment changer de code date1 et de date2 pour effectuer toute autre comparaison simple.

3
Max Yari

Une manière efficace et correcte de comparer les dates est:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

Il ignore la partie heure, il fonctionne pour différents fuseaux horaires et vous pouvez également comparer l'égalité ==. 86400000 est le nombre de millisecondes dans une journée (= 24*60*60*1000). 

Notez que l'opérateur d'égalité == devrait jamais être utilisé pour comparer les objets Date car il échoue lorsque vous vous attendez à ce qu'un test d'égalité fonctionne, car il compare deux objets Date (et ne compare pas les deux dates), par exemple:

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

Remarques: Si vous comparez des objets Date dont la partie horaire est définie sur zéro, vous pouvez utiliser date1.getTime() == date2.getTime(), mais l'optimisation ne vaut pas la peine. Vous pouvez utiliser <, >, <= ou >= lorsque vous comparez directement des objets Date, car ces opérateurs convertissent d'abord l'objet Date en appelant .valueOf() avant que l'opérateur effectue la comparaison.

2
robocat

Si vous comparez réellement la date uniquement sans composante de temps, une autre solution qui peut sembler erronée mais qui fonctionne et évite tous les maux de tête de Date() temps et fuseau horaire consiste à comparer directement la date de chaîne ISO à l'aide de la comparaison de chaîne:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

Vous pouvez obtenir la date du jour (date UTC, pas nécessairement la date locale de l'utilisateur) en utilisant:

> new Date().toISOString().split("T")[0]
"2019-04-22"

Mon argument en faveur de cela est la simplicité du programmeur - vous êtes beaucoup moins susceptible de rater cela que d'essayer de gérer correctement les horodatages et les décalages, probablement au détriment de la vitesse (je n'ai pas comparé les performances).

1
brittohalloran

Vous pouvez utiliser une certaine arithmétique avec le total de ms. 

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

J'aime cela parce qu'aucune mise à jour des dates d'origine n'est faite et est plus rapide que la division et la comparaison des chaînes.

J'espère que cette aide!

1
Miguel

Assurez-vous de construire userDate avec une année à 4 chiffres comme setFullYear(10, ...) !== setFullYear(2010, ...).

1
Alex K.

Après avoir lu cette question assez longtemps après son affichage, j'ai décidé de poster une autre solution, car je ne la trouvais pas assez satisfaisante, du moins pour mes besoins:

J'ai utilisé quelque chose comme ça:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

De cette façon, j'aurais pu utiliser les dates dans le format que je voulais pour le traitement ultérieur. Mais c’était seulement pour mon besoin, mais j’ai décidé de le poster quand même, peut-être que ça aidera quelqu'un

1
Aleks

Ce JS changera le contenu après la date définie voici la même chose mais sur w3schools

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->
0
NICHOLAS WOJNAR

Comparer avec setHours() sera une solution. Échantillon:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}
0
Chandrashekhar

Vous pouvez utiliser fp_incr (0). Ce qui définit la partie du fuseau horaire sur minuit et renvoie un objet de date.

0
user2849789

Utilisez simplement toDateString () aux deux dates. toDateString n'inclut pas l'heure. Par conséquent, les valeurs seront égales pour 2 fois à la même date, comme illustré ci-dessous.

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

De toute évidence, certaines des préoccupations de fuseau horaire exprimées ailleurs sur cette question sont valables, mais dans de nombreux scénarios, elles ne le sont pas.

0
Mike Feltman
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

si votre format de date est différent, utilisez moment.js library pour convertir le format de votre date, puis utilisez le code ci-dessus pour comparer deux dates.

Exemple :

Si votre date est en "JJ/MM/AAAA" et veut la convertir en "MM/JJ/AAAA", consultez l'exemple de code ci-dessous.

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);

0
Pritesh Singh

Je sais que l'on a déjà répondu à cette question et que ce n'est peut-être pas la meilleure solution, mais dans mon scénario, il fonctionne parfaitement. J'ai donc pensé que cela pourrait aider quelqu'un comme moi. 

si vous avez date string comme 

String dateString="2018-01-01T18:19:12.543";

et vous voulez juste comparer la partie date avec un autre objet Date dans JS,

var anotherDate=new Date(); //some date

alors vous devez convert l'objet string à Date en utilisant new Date("2018-01-01T18:19:12.543");

et voici le truc: -

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

J'ai utilisé toDateString() of Date object of JS, qui renvoie uniquement la chaîne Date. 

Remarque: N'oubliez pas d'utiliser la fonction .valueOf() lors de la comparaison des dates.

plus d'infos sur .valeOf() is here reference

Bonne codding.

0
R K Sharma

CA aidera. J'ai réussi à l'obtenir comme ça. 

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
0
Hiran D.A Walawage