Java 1.5 Calendar#compareTo() 混淆

标签 java date calendar gregorian-calendar

好吧,我真的被这个问题难住了。我有一个 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/

相关文章:

java.time.Instant 不会在消费者端呈现

sql-server - 在 SQL Server 中将日期从 dd-mm-yyyy 转换为 yyyy-mm-dd

javascript - 如何检查两个日期数组是否有匹配的项目?

javascript - 如何使用knockout JS 验证日期(年份)?

java - 从 Calendar.getTime() 设置日期值时年份不正确

java - EWS Java 获取 session

java - 正则表达式在 Java 代码中不起作用,尽管它可以在正则表达式网站上运行

java - Eclipse 3.8.1 中的奇怪行为

java - 像 WPF 或 Qt 这样的现代 Java GUI 框架?

MYSQL - 按日期接近度检索结果