web-dev-qa-db-fra.com

Comparer deux dates en utilisant le temps Joda

Je veux comparer deux dates, mais j'ai des problèmes. Une date est créée à partir d'un objet Java.util.date et l'autre est créée manuellement. Le code suivant est un exemple:

Date ds = new Date();
DateTime d = new DateTime(ds);

DateTime e = new DateTime(2012,12,07, 0, 0);
System.out.println(d.isEqual(e));

Cependant, le test s'avère false. Je suppose que c'est à cause du temps. Comment puis-je vérifier si ces deux dates sont égales (je veux dire l'année, le mois, la date sont identiques)?

28
Marc Rasmussen
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight()));

ou

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay()));
46
JB Nizet

Vous devriez utiliser toLocalDate () :

date1.toLocalDate().isEqual(date2.toLocalDate())

Cela éliminera la partie Heure du DateTime. 

Il y a une autre approche, mais cela ne tient pas compte du cas où les deux dates ont un fuseau horaire différent, donc c'est moins fiable:

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay())
18
Stan
return DateTimeComparator.getDateOnlyInstance().compare(first, second);

Via Comment comparer deux dates sans la portion de temps?

6
Vadzim

Si vous souhaitez ignorer les composants temporels (par exemple, vous souhaitez comparer uniquement les dates), vous pouvez utiliser la classe DateMidnight au lieu de Date Time. Donc, votre exemple ressemblera à quelque chose comme ceci:

Date ds = new Date();
DateMidnight d = new DateMidnight(ds);

DateMidnight e = new DateMidnight(2012, 12, 7);
System.out.println(d.isEqual(e));

Mais méfiez-vous, il imprimera "vrai" seulement aujourd'hui :)

Notez également que par défaut, JDK Date et toutes les classes instantanées Joda-Time (DateTime et DateMidnight inclus) sont construits à l'aide du fuseau horaire par défaut. Ainsi, si vous créez une date à comparer dans le code, mais en récupérez une autre dans la base de données qui stocke probablement les dates au format UTC, vous risquez de rencontrer des incohérences si vous ne vous trouvez pas dans le fuseau horaire UTC.

3
Andrii Polunin

S'agissant d'objets DateTime, leurs tranches horaires sont également prises en compte lorsque vous les comparez. Essayez de régler les parties horaires de la première date sur 0, comme suit:

d = d.withTime(0, 0, 0, 0);
1
Hiery Nomus

Je suis tombé sur cette question en cherchant une comparaison avec aujourd'hui. Voici comment comparer une date à aujourd'hui:

date1.toLocalDate().isBeforeNow() // works also with isAfterNow
1
Ismail H

Ceci est une méthode statique qui fonctionne pour moi.

public static boolean isSameDay(DateTime date1, DateTime date2){
    return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay());
}
0
BaptisteM