web-dev-qa-db-fra.com

Comparaison de deux objets Calendar

Je veux comparer deux objets Calendar pour voir s'ils contiennent tous les deux la même date. Je ne me soucie d'aucune valeur en dessous de jours.

J'ai implémenté cela et je ne peux penser à aucun cas où cela devrait échouer:

private static boolean areEqualDays(Calendar c1, Calendar c2) {
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    return (sdf.format(c1.getTime()).equals(sdf.format(c2.getTime())));
}

Cette approche est-elle correcte ou dois-je comparer c1 et c2 champ par champ?

21
Charlie-Blake

Je l'ai implémenté et je ne peux penser à aucun cas où cela devrait échouer

Il échouera si les deux calendriers sont dans des fuseaux horaires différents - ils pourraient représenter exactement la même milliseconde , mais cet instant pourrait tomber dans des jours différents en fonction de la fuseau horaire.

Il échouera également si les deux calendriers représentent des systèmes de calendrier différents - même s'ils représentent le même "jour", si les deux calendriers représentaient ce jour différemment, vous pourriez faire valoir qu'il devrait échouer.

Personnellement, je fortement vous conseille d'utiliser Joda Time qui a un type LocalDate pour représenter juste un date - qui éliminerait le problème de fuseau horaire, mais pas le problème du système de calendrier. Si vous pouvez toujours supposer que vous utilisez le même système de calendrier, ce n'est pas grave.

(En outre, effectuer des opérations de chaîne uniquement à des fins de comparaison est moche - je vérifierais simplement calendar.get(Calendar.YEAR) etc directement.)

18
Jon Skeet

EssayezcompareTo

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.compareTo(c2);

retourne:

la valeur 0 si l'heure représentée par l'argument est égale à l'heure représentée par ce Calendrier; une valeur inférieure à 0 si l'heure de ce calendrier est antérieure à l'heure représentée par l'argument; et une valeur supérieure à 0 si l'heure de ce calendrier est postérieure à l'heure représentée par l'argument.

MODIFIER

import org.Apache.commons.lang3.time.DateUtils;

Vous pouvez utiliser DateUtils.isSameDay pour vérifier si c'est le même jour.

boolean isSameDay = DateUtils.isSameDay(c1, c2);

28 mars 2002 13:45 et 28 mars 2002 06:01 reviendrait vrai. 28 mars 2002 13:45 et 12 mars 2002 13:45 retournerait faux.

52
Drogba

Vous pouvez utiliser quelque chose comme DateUtils

public boolean isSameDay(Calendar cal1, Calendar cal2) {
    if (cal1 == null || cal2 == null)
        return false;
    return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA)
            && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) 
            && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
}
9
Amit Deshpande

Pour comparer deux dates par rapport à un champ spécifique, définissez d'abord tous les champs en dessous de celui-ci à la valeur la plus basse (qui est 0 ou 1 selon le champ) en utilisant Calendar.set (champ int, valeur int), puis comparez. Pour comparer les différences de jours entre cal1 et cal2, vous devez définir MINUTE, SECOND et MILLISECOND sur les deux objets à 0 avant d'appeler cal1.compare (cal2).

1
Andreas

La classe Calendar a une méthode compareTo. Pourquoi n'appelez-vous pas directement cela?

1
Sumit Desai