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?
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.
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
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
.
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.
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.
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();
});
}
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.
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.
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).
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!
Assurez-vous de construire userDate
avec une année à 4 chiffres comme setFullYear(10, ...) !== setFullYear(2010, ...)
.
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
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 <-->
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)
}
Vous pouvez utiliser fp_incr (0). Ce qui définit la partie du fuseau horaire sur minuit et renvoie un objet de date.
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.
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);
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.
CA aidera. J'ai réussi à l'obtenir comme ça.
var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())