Je voudrais avoir une méthode compareTo qui ignore la partie temps d'un java.util.Date. Je suppose qu'il y a plusieurs façons de résoudre ce problème. Quelle est la manière la plus simple?
Réponses
Trop de publicités?Ma préférence est d'utiliser Joda Time qui le rend incroyablement facile:
DateTime first = ...;
DateTime second = ...;
LocalDate firstDate = first.toLocalDate();
LocalDate secondDate = second.toLocalDate();
return firstDate.compareTo(secondDate);
EDIT: Comme indiqué dans les commentaires, si vous utilisez DateTimeComparator.getDateOnlyInstance()
c'est encore plus simple :)
// TODO: consider extracting the comparator to a field.
return DateTimeComparator.getDateOnlyInstance().compare(first, second);
("Utilisation Joda Time" est la base de presque toutes SORTE de questions qui demandent à propos de java.util.Date
ou java.util.Calendar
. C'est un fond supérieur de l'API. Si vous êtes en train de faire quelque chose de significatif avec les dates/heures, vous devriez vraiment utiliser si vous le pouvez.)
Si vous êtes absolument obligé d'utiliser le construit de l'API, vous devez créer une instance de Calendar
à la date appropriée et en utilisant le fuseau horaire approprié. Vous pouvez ensuite régler chaque champ dans chaque calendrier de l'heure, les minutes, les secondes et les millisecondes à 0, et de comparer l'résultant fois. Certainement dégueulasse comparé avec le Joda solution bien :)
Le fuseau horaire partie est importante: java.util.Date
est toujours basé sur l'heure UTC. Dans la plupart des cas où j'ai été intéressé par une date, qui a été une date dans un fuseau horaire spécifique. Que sur ses propres va vous forcer à utiliser Calendar
ou Joda Temps (sauf si vous voulez en compte pour le temps de la zone de vous-même, que je ne recommande pas.)
Apache commons-lang est presque omniprésent. Alors qu'en est-il?
if (DateUtils.isSameDay(date1, date2)) {
// it's same
} else if (date1.before(date2)) {
// it's before
} else {
// it's after
}
Si vous voulez vraiment utiliser java.util.Date, vous ferez quelque chose comme ceci:
public class TimeIgnoringComparator implements Comparator<Date> {
public int compare(Date d1, Date d2) {
if (d1.getYear() != d2.getYear())
return d1.getYear() - d2.getYear();
if (d1.getMonth() != d2.getMonth())
return d1.getMonth() - d2.getMonth();
return d1.getDate() - d2.getDate();
}
}
ou, à la place d'un calendrier (préféré, depuis que getYear () et tel sont obsolètes)
public class TimeIgnoringComparator implements Comparator<Calendar> {
public int compare(Calendar c1, Calendar c2) {
if (c1.get(Calendar.YEAR) != c2.get(Calendar.YEAR))
return c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
if (c1.get(Calendar.MONTH) != c2.get(Calendar.MONTH))
return c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH);
return c1.get(Calendar.DAY_OF_MONTH) - c2.get(Calendar.DAY_OF_MONTH);
}
}
Ma préférence serait d'utiliser la Joda bibliothèque insetad d' java.util.Date
directement, comme Joda fait une distinction entre la date et l'heure (voir YearMonthDay et DateTime classes).
Toutefois, si vous ne souhaitez utiliser java.util.Date
je suggère d'écrire une méthode utilitaire; par exemple
public static Date setTimeToMidnight(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime( date );
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}