好吧,我真的被这个问题难住了。我有一个 GregorianCalendar 对象,我想确定它是过去、现在还是将来。到目前为止,Calendar#compareTo文档让我感到困惑,因为我得到的结果不稳定。一个简单的测试类将说明我的问题:
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));
}
}
输出:
compare datePresent to datePast: 1
compare datePresent to datePresent: 0
compare datePresent to dateFuture: 0
我对compareTo的理解是最后一行应该是-1。谁能告诉我我做错了什么?
最佳答案
您已将 6 个月添加到 datePast
,而不是 dateFuture
。这是工作代码:
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));
}
}
您的结果会不一致,因为有时 dateFuture
会晚于datePresent
,具体取决于内部时钟“滴答”的时间。
除此之外,我还忍不住给出我的标准 Java 日期和时间建议:使用 Joda Time反而。尽管许多类型是不可变的这一事实会有所帮助,但它不对这个特定问题负责。但总的来说,它是一个更好的库。
关于Java 1.5 Calendar#compareTo() 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/691352/