web-dev-qa-db-fra.com

Devrais-je utiliser Calendar.compareTo () pour comparer les dates?

Est-ce un moyen valable de comparer les dates:

Calendar someCalendar1 = Calendar.getInstance(); // current date/time
someCalendar1.add(Calendar.DATE, -14);

Calendar someCalendar2 = Calendar.getInstance();
someCalendar2.setTime(someDate); // someDate is in the format of MM/dd/yyyy

if(someCalendar2.compareTo(someCalendar1) < 0){
   ...Code...               
}

... ou y a-t-il une meilleure approche?

16
Milli

Date implémente lui-même ce qui est comparable, il n'y a donc aucune raison de l'envelopper dans le calendrier:

Calendar someCalendar1 = Calendar.getInstance(); // current date/time
someCalendar1.add(Calendar.DATE, -14);

if (someDate.compareTo(someCalendar1.getTime()) < 0) {
   ...Code...                           
}

Date a également des méthodes pratiques after () et before () qui facilitent la lecture de la comparaison ci-dessus:

if (someDate.before(someCalendar1.getTime())) {
   ...Code...                           
}

Enfin, si vous utilisez beaucoup la date et l'heure, envisagez d'utiliser Joda Time au lieu des classes Java intégrées. C'est BEAUCOUP plus pratique et fonctionnel:

DateTime dt = new DateTime().minusWeeks(2);
if (new DateTime(someDate).isBefore(dt)) {
   ...Code...                           
}
19
ChssPly76

C'est valide, mais vous êtes un peu confus à propos de someDate - Calendar.setTime prend un Java.util.Date, ce qui est juste un wrapper autour d'une long indiquant le nombre de millisecondes depuis le 1er janvier 1970 à minuit, UTC. Ce n'est pas "au format MM/jj/aaa" - c'est une représentation sous forme de chaîne, pas un Java.util.Date. S'il arrive d'imprimer quelque chose au format MM/dd/yyyy, c'est exactement ce que Date.toString fait pour vous - cela ne fait pas partie intégrante du format.

En passant, je vous recommande personnellement d'éviter complètement Java.util.Date et Java.util.Calendar et d'utiliser Joda Time à la place. C'est une beaucoup meilleure API.

7
Jon Skeet
2
Nico

Comme exemple de la raison pour laquelle Joda est meilleur, prenez l’heure avancée.

Si vous mesurez "un jour" comme 1000 * 60 * 60 * 24 millisecondes, la bibliothèque de dates - et la bibliothèque de calendriers - oublient qu’il ya un jour dans l’année avec 25 heures et un autre avec 23 heures. mise à jour des calculs si vous vous fiez uniquement aux classes Java intégrées à l'API J2SE.

Joda est probablement à moitié le remplaçant immédiat de GregorianCalendar, Calendar et Date dans une future version de Java.

2
Dean J

C'est bon. Aussi, vous pouvez utiliser avant () et après ():

package demo.so;

import Java.util.Date;
import Java.text.DateFormat;
import Java.text.SimpleDateFormat;
import Java.util.Calendar;

public class Tester {

    public static void main(String[] args) throws Exception {

    Calendar someCalendar1 = Calendar.getInstance(); // current date/time
    someCalendar1.add(Calendar.DATE, -11);

    DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
    Date someDate =   df.parse("10/08/2009");

    Calendar someCalendar2 = Calendar.getInstance();
    someCalendar2.setTime(someDate);

    String cal1 = df.format(someCalendar1.getTime());
    String cal2 = df.format(someCalendar2.getTime());

    if (someCalendar1.equals(someCalendar2))
        System.out.println( cal1 + " is the same as " + cal2);
    if (someCalendar1.after(someCalendar2))
        System.out.println(cal1 + " is after " + cal2);
    if (someCalendar1.before(someCalendar2))
        System.out.println(cal1 + " is before " + cal2);

    }

}

Mais vous ne devriez pas utiliser Date, c'est obsolète et une source de problèmes avec la gestion des dates. Construisez votre propre wrapper pour GregorianCalendar ou utilisez une bonne bibliothèque, comme Joda.

0
JuanZe