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?
la source
date1 === date2
ne semble pas fournir un comportement cohérent; il vaut mieux fairedate1.valueOf() === b.valueOf()
ou mêmedate1.getTime() === date2.getTime()
. Étrangeté.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 navigateurdate2.toDateString()
et vous reviendrezMon Sep 19 2011
plutôt que le mardi 20!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
setUTCxxx
méthodes au lieu des variantes sensibles au fuseau horaire local.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 ettoString()
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 ...
Parfois, la comparabilité internationale l'emporte sur la précision locale. Dans ce cas, faites ceci ...
Désérialiser une date
Souvent, les dates sur le fil seront au format AAAA-MM-JJ. Pour les désérialiser, faites ceci ...
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 ...
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.
la source
Que dis-tu de ça?
Il vous permet de comparer la partie date de la date comme ceci sans affecter la valeur de votre variable:
la source
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
Date
etDateTime
beaucoup, 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:
Le deuxième paramètre que vous passez en
isAfter
est la précision de faire la comparaison et peut être l' unyear
,month
,week
,day
,hour
,minute
ousecond
.la source
Comparez simplement en utilisant .toDateString comme ci-dessous:
Cela vous renverra seulement une partie de la date et non l'heure ou le fuseau horaire, comme ceci:
Par conséquent, les deux dates peuvent également être comparées dans ce format sans que le temps en fasse partie.
la source
new Date(new Date().toDateString());
Cela peut être une version un peu plus propre, notez également que vous devez toujours utiliser un radix lorsque vous utilisez parseInt.
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.
la source
La bibliothèque date.js est pratique pour ces choses. Cela rend tous les scripts JS liés à la date beaucoup plus faciles.
la source
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:Vous pouvez obtenir la date actuelle (date UTC, pas nécessairement la date locale de l'utilisateur) en utilisant:
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)
la source
new Date().toISOString().substr(0, 10) // "2019-04-22"
.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 convertirnew Date(new Date().toLocaleDateString())
pour le comparer avec précision à une autre date.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.
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.
la source
Voici comment je le fais:
la source
getTime()
c'est requis?setHours()
modifie l'objet auquel il est appelé et renvoie la date en nombre de millisecondes (équivalent à l'appelgetTime()
). Par conséquent, votretoday
variable n'est pas unDate
objet 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'appelergetTime()
avant de comparer, car vous l'avez déjà de manière obscure.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
date
objet 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 ".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 égalDe plus, évidemment, vous pouvez basculer
date1
etdate2
à certains endroits pour effectuer toute autre comparaison simple.la source
Une manière efficace et correcte de comparer les dates est:
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: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.la source
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:
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
la source
currentDate
variable n'est pas une date, c'est un nombre de millisecondes depuis le 1970-01-01. LasetHours()
méthode modifie l'objet date auquel elle est appelée et renvoie l'équivalent degetTime()
(valeur de date en millisecondes depuis le 01/01/1970).Assurez-vous de construire
userDate
avec une année à 4 chiffres commesetFullYear(10, ...) !== setFullYear(2010, ...)
.la source
Vous pouvez utiliser de l'arithmétique avec un total de ms.
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!
la source
Ce JS changera le contenu après la date fixée, voici la même chose mais sur w3schools
la source
Cela fonctionne pour moi:
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
la source
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 string
commeet vous voulez simplement comparer la partie date avec un autre objet Date dans JS,
alors vous devez
convert
l'string
àDate
objet en utilisantnew Date("2018-01-01T18:19:12.543");
et voici l'astuce: -
J'ai utilisé
toDateString()
deDate object
JS, 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érenceCodage heureux.
la source
CA aidera. J'ai réussi à l'obtenir comme ça.
la source
La comparaison avec
setHours()
sera une solution. Échantillon:la source
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.
la source
Vous pouvez utiliser fp_incr (0). Ce qui définit la partie du fuseau horaire à minuit et renvoie un objet date.
la source