Java 1.5 Calendrier # compareTo () confusion
-
22-08-2019 - |
Question
Ok, je suis officiellement déconcerté sur celui-ci. J'ai un objet GregorianCalendar que je voudrais savoir s'il est dans le passé, présent ou futur. Jusqu'à présent, le Calendrier # compareTo de docs sont source de confusion pour moi, dans ce que j'obtiens des résultats erratiques. Une classe de test simple illustrera mon problème:
import java.util.Calendar;
import java.util.GregorianCalendar;
public class MyCal
{
public static void main( String[] args )
{
GregorianCalendar datePast = new GregorianCalendar();
datePast.add(Calendar.MONTH, -6); // subtract 6 months
GregorianCalendar datePresent = new GregorianCalendar();
GregorianCalendar dateFuture = new GregorianCalendar();
datePast.add(Calendar.MONTH, 6); // add 6 months
System.out.println("compare datePresent to datePast: "+datePresent.compareTo(datePast));
System.out.println("compare datePresent to datePresent: "+datePresent.compareTo(datePresent));
System.out.println("compare datePresent to dateFuture: "+datePresent.compareTo(dateFuture));
}
}
Et la sortie:
compare datePresent to datePast: 1
compare datePresent to datePresent: 0
compare datePresent to dateFuture: 0
Ma compréhension de compareTo est que la dernière ligne devrait être un -1. Quelqu'un peut-il me dire ce que je fais mal?
La solution
Vous avez ajouté 6 mois à datePast
, non dateFuture
. Voici le code de travail:
import java.util.Calendar;
import java.util.GregorianCalendar;
public class MyCal
{
public static void main( String[] args )
{
GregorianCalendar datePast = new GregorianCalendar();
datePast.add(Calendar.MONTH, -6); // subtract 6 months
GregorianCalendar datePresent = new GregorianCalendar();
GregorianCalendar dateFuture = new GregorianCalendar();
dateFuture.add(Calendar.MONTH, 6); // add 6 months
System.out.println("compare datePresent to datePast: "+datePresent.compareTo(datePast));
System.out.println("compare datePresent to datePresent: "+datePresent.compareTo(datePresent));
System.out.println("compare datePresent to dateFuture: "+datePresent.compareTo(dateFuture));
}
}
Vos résultats auraient été incompatibles parce que parfois dateFuture
serait plus tard datePresent
, selon le moment où l'horloge interne « tic tac ».
En plus de tout cela, je ne peux que donner ma date Java standard et des conseils temps: utiliser Joda temps à la place. Ce n'est pas responsable de ce problème particulier, même si le fait que la plupart des types sont immuables aurait aidé. Mais en général, il est un meilleur beaucoup bibliothèque.