La méthode Date before renvoie false si les deux dates sont égales

Lorsque vous comparez deux dates avec date avant la méthode, si les dates sont similaires, il renvoie false comme suit:

  • date1 le: Mar Déc 18 00:00:00 GMT+02:00 2012
  • date2 le: Mar Déc 18 00:00:00 GMT+02:00 2012

La méthode {[0] } renvoie toujours false dans ce cas, ce qui n'a pas de sens pour moi (ne s'applique pas à mon cas en d'autres termes). je veux vérifier si une date (jour/mois/année) est égale à la date d'aujourd'hui (jour/mois/année) ?

25
demandé sur 1615903 2012-12-18 19:48:38

7 réponses

, Comme date1.equals(date2), il est normal que date1.before(date2) renvoie la valeur false. Comme le fera date1.after(date2).

Les deux dates sont les mêmes, donc l'une n'est pas avant l'autre.

From javadoc : true si et seulement si l'instant de temps représenté par cet objet Date est strictement antérieur à l'instant représenté par when; false sinon.

Essayez quelque chose comme :

if(date1.before(date2) || date1.equals(date2)) ...

Les réponses fournies ci-dessous suggèrent de tester l'inverse, et elles ont raison:

if(!date1.after(date2)) ...

Les deux tests sont équivalent.

62
répondu xlecoustillier 2018-01-08 14:43:28

Vous pouvez simplement tester l'inverse :

!date1.after(date2)

Vous pouvez toujours convertir une vérification de commande stricte en une vérification non stricte de cette manière. Depuis mathématiquement:

a > b ⇔ ¬ (a ≤ b)
38
répondu bowmore 2012-12-18 19:23:16

Si les dates sont égales, alors évidemment l'une N'est pas avant l'Autre: false is the correct return for date1.before(date2) where date1 == date2.

Si vous avez besoin deinclure égalité, pourquoi ne pas faire une négation sur .after() (évidemment si la date 1 n'est pas après la date 2, alors c'estégal ou avant ), mais je m'assurerais que c'est en fait une logique correcte pour ce que vous essayez d'accomplir.

Si l'égalité est un cas particulier qui doit être traité différemment, alors ayez un test séparé pour .equals().

7
répondu taswyn 2012-12-18 16:11:55

Vous pouvez utiliser l'inverse comme proposé par bowmore: !date1.after(date2)

Ou si vous recherchez des plages, between peut inclure les points de terminaison, auquel cas vous pouvez use return !d.before(min) && !d.after(max)

6
répondu Rafael Moreira 2014-01-03 16:10:30

Vous pouvez également l'utiliser:

boolean check = dateOne.before(dateTwo) || DateUtils.isSameDay(dateOne, dateTwo);

DateUtils est de org.Apache.commun.lang.temps paquet

4
répondu zygimantus 2015-10-13 08:33:55

Le vrai problème avec votre code est peut-être que vous ne prenez pas en compte les millis et la fonction before fait

Deux objets java.util.Date avec un résultat toString: Dim août 28 00: 00: 00 CEST 2016 peut avoir une valeur différente lors de l'appel à getTime. Par exemple

Date d1;
Date d2;
d1.toString(); // = Sun Aug 28 00:00:00 CEST 2016
d2.toString(); // = Sun Aug 28 00:00:00 CEST 2016
d1.getTime(); // = 1472335200605
d2.getTime(); // = 1472335200000

Bien sûr, ces dates ne sont pas égales.

Depuis javadoc:

" retourne: true si et seulement si l'instant de temps représenté par cet objet Date est strictement instant représenté par when; false sinon."

2
répondu alvaro torrico 2016-08-29 22:28:17

C'est un comportement normal, car dateBefore vérifie si une date est avant l'autre. Si les dates sont égales, cela est évident pour être faux.

1
répondu svz 2012-12-18 15:51:14