Comparaison de la date uniquement sans comparaison de l'heure en JavaScript

397

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

Il serait peut-être plus simple de simplement comparer la date et non l'heure. Je ne sais pas trop comment faire cela non plus, et j'ai cherché, mais je n'ai pas trouvé mon problème exact.

BTW, lorsque j'affiche les deux dates dans une alerte, elles s'affichent exactement comme 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?

moléculezz
la source

Réponses:

781

J'apprends toujours JavaScript, et la seule façon que j'ai trouvée qui fonctionne pour moi de comparer deux dates sans l'heure est d'utiliser la setHoursméthode de l'objet Date et de mettre à zéro les heures, minutes, secondes et millisecondes. Comparez ensuite les deux dates.

Par exemple,

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

date2sera définie avec zéro, heure, minutes, secondes et millisecondes, mais date1 les définira à l'heure à laquelle date1 a été créée. Pour supprimer les heures, les minutes, les secondes et les millisecondes à date1, procédez comme suit:

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

Vous pouvez maintenant comparer les deux dates en tant que DATES uniquement sans vous soucier des éléments de temps.

Nexar
la source
63
Veuillez noter que le test par date1 === date2ne semble pas fournir un comportement cohérent; il vaut mieux faire date1.valueOf() === b.valueOf()ou même date1.getTime() === date2.getTime(). Étrangeté.
Erwin Wessels
4
Attention: si date1 et date2 sont en hiver et en été, et que vous prévoyez d'itérer de l'une à l'autre avec addDays (1), le problème est qu'elles n'auront pas le même fuseau horaire à cause de l'heure d'été, donc la dernière comparer qui devrait donner des dates égales ne fonctionnera pas car les deux dates ne sont pas vraiment à 00: 00: 00: 0.
Oliver
9
Je sais que c'est une vieille question, mais elle apparaît d'abord dans Google lors de la recherche. Soyez prudent avec cette réponse. Cela donnera des réponses incorrectes si l'utilisateur n'est pas dans le même fuseau horaire que le créateur de l'objet date. Par exemple, changez le fuseau horaire du système d'exploitation de votre ordinateur en heure de la côte Est (États-Unis). Ouvrez la console de votre navigateur et tapez var date2 = new Date(2011,8,20). Maintenant, changez le fuseau horaire du système d'exploitation en heure du Pacifique (US). Dans le même type de console de navigateur date2.toDateString()et vous reviendrez Mon Sep 19 2011plutôt que le mardi 20!
Adam
9
Notez également que setHours()définit l'heure en fonction du fuseau horaire actuel, détecté automatiquement par le navigateur. Essayez: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());imprimera "2016-02-28T15:00:00.000Z", date 28, mais pas 29 Mon fuseau horaire actuel estAsia/Tokyo
transang
8
Cette réponse devrait vraiment être mise à jour pour utiliser des setUTCxxxméthodes au lieu des variantes sensibles au fuseau horaire local.
Stijn de Witt
137

ATTENTION À LA FUSEAU HORAIRE

L'utilisation immédiate de l'objet date pour représenter juste une date vous place dans un énorme problème de précision excessive. Vous devez gérer le temps et le fuseau horaire pour les garder à l'écart, et ils peuvent se faufiler à tout moment. La réponse acceptée à cette question tombe dans le piège.

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 (statiques) pour traduire vers et depuis des chaînes, en utilisant par défaut le fuseau horaire "local" de l'appareil, ou, si spécifié, UTC ou un autre fuseau horaire. Pour représenter just-a-date ™ avec un objet date, 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, à la fois lorsque vous créez votre objet Date UTC à minuit et lorsque vous le sérialisez.

Beaucoup de gens sont confus par le comportement par défaut de la console. Si vous vaporisez une date sur la console, la sortie que vous voyez inclura votre fuseau horaire. C'est simplement parce que la console appelle toString()votre date et toString()vous donne une représentation locale. La date sous-jacente n'a pas de fuseau horaire ! (Tant que l'heure correspond au décalage du fuseau horaire, vous avez toujours un objet de date UTC à minuit)

Désérialisation (ou création d'objets de date UTC à minuit)

Il s'agit de l'étape d'arrondi, avec l'astuce qu'il y a deux «bonnes» réponses. 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

Désérialiser une date

Souvent, les dates sur le fil seront au format AAAA-MM-JJ. Pour les désérialiser, faites ceci ...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

Sérialisation

Après avoir pris soin de gérer le fuseau horaire lors de la création, vous devez maintenant vous assurer de ne pas afficher le fuseau horaire lors de la conversion 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()

Alors pour répondre à votre question, 7 ans trop tard ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

Voyez-le courir ...

Mise à jour 2019 ... des trucs gratuits ...

Compte tenu de la popularité de cette réponse, j'ai tout mis en code. La fonction suivante renvoie un objet date enveloppé et expose uniquement les fonctions dont l'utilisation est sûre avec just-a-date ™.

Appelez-le avec un objet Date et il se résoudra en JustADate reflétant le fuseau horaire de l'utilisateur. Appelez-le avec une chaîne: si la chaîne est un ISO 8601 avec un fuseau horaire spécifié, nous allons simplement arrondir la partie temporelle. Si le fuseau horaire n'est pas spécifié, nous le convertirons en une date reflétant le fuseau horaire local, tout comme pour les objets de date.

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())

bbsimonbb
la source
3
Votre réponse contient des informations vraiment précieuses! Malheureusement, vous n'avez pas réellement ajouté la réponse à la question réelle d'OP, ce qui m'a empêché de voter. Essayez d'ajouter un petit extrait de code qui répond à la question d'OP.
Stijn de Witt
Ha ha ha @ '7 ans trop tard'! J'aime votre style user1585345! Vous avez obtenu mon vote!
Stijn de Witt
J'ai trouvé cela utile. Notez qu'il y a une faute de frappe dans l'extrait de "comparabilité internationale". Je pense que cela devrait être: new Date (Date.UTC (myDate.getUTCFullYear (), myDate.getUTCMonth (), myDate.getUTCDate ()));
RikRak
1
J'aimerais pouvoir voter 100 fois cette réponse !!!
Sнаđошƒаӽ
77

Que dis-tu de ça?

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

Il vous permet de comparer la partie 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
AdEpt
la source
C'est de loin la réponse la plus élégante au message original. Je n'ai pas créé de fonction distincte pour mes besoins, j'ai simplement inclus les deux lignes de code.
Danimal Reks
25

Utilisation de Moment.js

Si vous avez la possibilité d'inclure une bibliothèque tierce, cela vaut vraiment la peine de jeter un œil à Moment.js . Cela rend le travail avec Dateet DateTimebeaucoup, beaucoup plus facile.

Par exemple, si une date vient après une autre date mais en excluant leurs heures, 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 passez en isAfterest la précision de faire la comparaison et peut être l' un year, month, week, day, hour, minuteou second.

Joshua Pinter
la source
4
a obtenu une accélération de 100x passant d'une solution momentjs à une solution Date () + sethours. amis prudents :-)
2c2c
@ 2c2c Intéressant. Certainement bon de connaître l'impact sur les performances. Combien d'opérations avez-vous utilisées pour votre référence?
Joshua Pinter
1
j'étais à environ 1 mil comparaisons.
n'a pas établi de
17

Comparez simplement en utilisant .toDateString comme ci-dessous:

new Date().toDateString();

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

"Ven 03 fév 2017"

Par conséquent, les deux dates peuvent également être comparées dans ce format sans que le temps en fasse partie.

Rahi
la source
2
C'est un bon début, mais cela ne permettra pas de comparaisons car c'est maintenant une chaîne. Pour comparer, remplacez-le par un objet Date en faisant new Date(new Date().toDateString());
Grid Trekkor
@GridTrekkor True, mais si vous voulez juste un test rapide d'égalité, c'est la solution la plus simple.
CM
8

Cela peut être une version un peu plus propre, notez également que vous devez toujours utiliser un radix 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);
    }
});

Extraire l'analyse MDC page pour plus d'informations sur le radix.

JSLint est un excellent outil pour capturer des choses comme un radix manquant et bien d'autres choses qui peuvent provoquer des erreurs obscures et difficiles à déboguer. Cela vous oblige à utiliser de meilleures normes de codage afin d'éviter de futurs maux de tête. Je l'utilise sur chaque projet JavaScript que je code.

Code inutile
la source
@EmKay Cela ne devrait pas être un problème aussi important maintenant que ES5 est assez standard dans la plupart des navigateurs et il interdit l'interprétation octale MAIS certains navigateurs peuvent toujours utiliser l'ancienne interprétation octale pour des raisons de compatibilité descendante, donc je continuerais à utiliser un radix dans un avenir prévisible.
Code inutile
Si vous utilisez des interprétations octales en mode strict , des erreurs seront lancées, ce qui est une bonne chose car cela vous aide à trouver des erreurs qui pourraient être mal interprétées.
Code inutile
4

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

Diodée - James MacFarlane
la source
11
Pouvez-vous ajouter plus d'informations sur la façon dont cette bibliothèque facilite les choses?
Mahmoud Hanafy
4

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

> "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 actuelle (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 bâcler cela que d'essayer de gérer correctement les heures et les décalages de données, probablement au détriment de la vitesse (je n'ai pas comparé les performances)

brittohalloran
la source
Vous pouvez aussi le faire new Date().toISOString().substr(0, 10) // "2019-04-22".
stomy
Pour la date locale (date non UTC), vous pouvez utiliser new Date().toLocaleDateString() // "8/26/2019". Mais la comparaison du texte ne sera pas exacte (comme "8/26/2019" >= "9/29/2001"c'est faux). Vous devrez donc le convertir new Date(new Date().toLocaleDateString())pour le comparer avec précision à une autre date.
stomy
4

Utilisez simplement toDateString () aux deux dates. toDateString n'inclut pas l'heure, donc pour 2 fois à la même date, les valeurs seront égales, 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 concernant le fuseau horaire exprimées ailleurs sur cette question sont valables, mais dans de nombreux scénarios, elles ne sont pas pertinentes.

Mike Feltman
la source
1
Dans mon cas, cette solution est bien meilleure que la réponse sélectionnée et les réponses les plus votées. Il est dit explicitement dans le titre "sans comparer le temps", cette solution fait exactement cela, ce qui évite de régler l'heure pour manipuler la comparaison. Pour répondre "L'événement X et l'événement Y se sont-ils produits le même jour", il est plus logique de comparer uniquement la date, plutôt que de répondre "Est 00: 00: 00.00 AM de la date de l'événement X exactement la même chose avec 00:00: 00.00 de la date de l'événement Y? " c'est ce que font beaucoup d'autres répondeurs
Mr.K
3

Voici comment 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();
    });
}
Fabrizio
la source
Je l'utilise actuellement en production et je n'ai aucun problème ou incompatibilité de navigateur etc ... des raisons pour lesquelles vous dites que getTime()c'est requis?
Fabrizio
5
Veuillez noter que setHours()modifie l'objet auquel il est appelé et renvoie la date en nombre de millisecondes (équivalent à l'appel getTime()). Par conséquent, votre todayvariable n'est pas un Dateobjet comme certains pourraient s'y attendre, mais est en fait un nombre entier de millisecondes. Comme effet secondaire, c'est pourquoi vous n'avez pas eu besoin d'appeler getTime()avant de comparer, car vous l'avez déjà de manière obscure.
Timothy Walters
3

Comme je ne vois pas ici d'approche similaire et que je n'aime pas mettre h / m / s / ms à 0, car cela peut causer des problèmes de transition précise vers le fuseau horaire local avec un dateobjet modifié (je suppose que oui), permettez-moi présente ici ceci, écrit il y a quelques instants, lil fonction:

+: Facile à utiliser, effectue une comparaison de base des opérations (comparer le jour, le mois et l'année sans le temps.)
-: Il semble que ce soit l'opposé complet de la pensée " prête à l'emploi ".

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 un contrôle d'égalité,
datecompare(date1, '>', date2)pour un contrôle plus important,
!datecompare(date1, '>', date2) inférieur ou égal

De plus, évidemment, vous pouvez basculer date1et date2à certains endroits pour effectuer toute autre comparaison simple.

Max Yari
la source
Nice one, plus plus, m'a aidé, maintenant j'espère que les conversions iso ne mordent pas, haha, thx.
edencorbin
3

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 temporelle, il fonctionne pour différents fuseaux horaires et vous pouvez également comparer pour l'égalité ==. 86400000 est le nombre de millisecondes par jour ( = 24*60*60*1000).

Attention, l'opérateur d'égalité ne== doit jamais être utilisé pour comparer des 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 heure est définie sur zéro, vous pouvez l'utiliser, date1.getTime() == date2.getTime()mais cela ne vaut guère l'optimisation. Vous pouvez utiliser <, >, <=ou >=lorsque l'on compare les objets directement date parce que ces opérateurs convertissent d' abord l'objet Date en appelant .valueOf()avant que l'opérateur ne la comparaison.

robocat
la source
2

Après avoir lu cette question tout à fait en même temps après sa publication, j'ai décidé de publier une autre solution, car je ne l'ai pas trouvée assez satisfaisante, du moins à 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 uniquement pour mon besoin, mais j'ai quand même décidé de le poster, peut-être que cela aidera quelqu'un

Aleks
la source
1
Veuillez noter que votre currentDatevariable n'est pas une date, c'est un nombre de millisecondes depuis le 1970-01-01. La setHours()méthode modifie l'objet date auquel elle est appelée et renvoie l'équivalent de getTime()(valeur de date en millisecondes depuis le 01/01/1970).
Timothy Walters
1

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

Alex K.
la source
1

Vous pouvez utiliser de l'arithmétique avec un 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 car aucune mise à jour des dates originales n'est effectuée et fonctionne plus rapidement que le partage et la comparaison de chaînes.

J'espère que cette aide!

Miguel
la source
1

Ce JS changera le contenu après la date fixée, 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 <-->

NICHOLAS WOJNAR
la source
1

Cela fonctionne pour moi:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

Dans la réponse acceptée, il y a un problème de fuseau horaire et l'autre heure n'est pas 00:00:00

Yogesh Devgun
la source
0

Je sais que cette question a déjà été répondue et ce n'est peut-être pas la meilleure façon, mais dans mon scénario, cela fonctionne parfaitement, alors j'ai pensé que cela pourrait aider quelqu'un comme moi.

si vous avez date stringcomme

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

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

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

alors vous devez convertl' stringà Dateobjet en utilisantnew Date("2018-01-01T18:19:12.543");

et voici l'astuce: -

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

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

J'ai utilisé toDateString()de Date objectJS, qui renvoie uniquement la chaîne Date.

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

plus d'informations sur .valeOf()est ici la référence

Codage heureux.

RK Sharma
la source
0

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

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
Hiran DA Walawage
la source
0

La comparaison 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)
}
Chandrashekhar Kase
la source
0
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 la bibliothèque moment.js pour convertir le format de votre date, puis utilisez le code ci-dessus pour comparer deux dates

Exemple :

Si votre date est en "DD / MM / YYYY" et que vous souhaitez la convertir en "MM / DD / YYYY", 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);
Pritesh Singh
la source
0

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

user2849789
la source