1

好的,我正式被这个难住了。我有一个 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。谁能告诉我我做错了什么?

4

1 回答 1

2

您已将 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。它不对这个特定问题负责,尽管许多类型是不可变的这一事实会有所帮助。但总的来说,它是一个更好的库。

于 2009-03-27T20:30:05.410 回答