2010-02-07 10 views
3

J'essaie un exemple:comparant la date d'aujourd'hui + 30 jours à une autre date

DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 
String date = "03/09/2010"; //30 days from today 
Date usefullDate = df.parse(date); 

Calendar todaysDatePlus30Days = Calendar.getInstance(); 
todaysDatePlus30Days.add(Calendar.DAY_OF_YEAR, 30); 

System.out.println ("Compared Value: " + 
usefullDate.compareTo(todaysDatePlus30Days.getTime())) 

la valeur imprimée est -1. pourquoi n'imprime-t-il pas 0?

Je pense que le problème est que todaysDatePlus30Days.getTime() apporte également l'heure actuelle. tandis que usefullDate est 00:00:00.

Alors la prochaine question est comment puis-je obtenir le date?

+0

Voir ma réponse ci-dessous. – Pointy

Répondre

3

La date que vous analysez est implicitement minuit de cette date. Celui que vous construisez sera l'heure actuelle de la journée.

Essayez:

Calendar todayPlus30 = new GregorianCalendar() {{ 
    add(Calendar.DAY_OF_YEAR, 30); 
    set(Calendar.HOUR_OF_DAY, 0); 
    set(Calendar.MINUTE, 0); 
    set(Calendar.SECOND, 0); 
    set(Calendar.MILLISECOND, 0); 
}}; 

je pourrais avoir deux ou trois de ces constantes mal, et vous pouvez le faire avec Calendar.newInstance() si vous voulez, mais la syntaxe est un peu différent.

+1

Votre cause est juste, mais vous ne pouvez pas sous-classer une valeur de retour comme ça. Vous devrez garder une référence et appeler les ensembles sur cette référence, ou utiliser 'new GregorianCalendar() {{' – Yishai

+0

correct. J'ai dû appeler des ensembles sur l'objet 'todayPlus30' – Omnipresent

+0

Oh, à droite, désolé; J'utilise toujours GregorianCalendar et je viens de taper en mode robot :-) – Pointy

3

En guise de commentaire, j'étudierais JodaTime pour tous les travaux Java liés à la date. Il est beaucoup plus intuitif et ne souffre pas de problèmes de threading dans les classes de formatage et d'analyse de date/heure (contrairement aux bibliothèques Java standard). De nos jours, c'est un de facto de remplacement pour le désordre java.util.{Date,Calendar}.

par exemple. Voir la classe LocalDate et sa méthode plusDays().

1

Lorsque vous les System.out.println(..), le résultat est:

Tue Mar 09 00:00:00 EET 2010 
Tue Mar 09 20:31:39 EET 2010 

Ils ne sont pas égaux - leurs heures diffèrent. Cela est dû au fait que Calendar.getInstance() renvoie la date actuelle et heure.

Si vous voulez qu'ils soient égaux, vous aurez à set(..) les heures, minutes et secondes champs à 0.

1

Si vous ajoutez les lignes suivantes à votre exemple, vous apprendrez que utile a une date autre temps

System.out.println ("" + usefullDate); 
System.out.println ("" + todaysDatePlus30Days.getTime()); 
0

Je suggère d'utiliser JodaTime, mais si vous utilisez longtemps pour que la date/heure vous pouvez faire ...

long todaysDay = System.currentTimeMillis()/MILLIS_PER_DAY; 
long in30days = todaysDay + 30; 
long usefulDay = usefulDate.getTime()/MILLIS_PER_DAY; 
if (in30days == usefulDay) // days are the same. 

note: les calculs Agit comme par G MT + 0 fuseau horaire. Cela peut faire une différence.

Questions connexes