为什么JodaTime和Calendar会返回不同的结果

时间:2011-07-26 19:54:52

标签: java time calendar jodatime

为什么此测试失败:

    DateTime dateTime = new DateTime(1997,01,01,00,00,00,00, DateTimeZone.UTC);
    long jodaMills = dateTime.getMillis();

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.set(1997,01,01,00,00,00);
    long calMills = cal.getTimeInMillis();

    Assert.assertEquals(jodaMills, calMills);

我得到的结果是: 预计:852076800000 实际:854755200964

它们不应该是相同的数字吗?

4 个答案:

答案 0 :(得分:22)

日历基于零个月,JodaTime月份字段从1开始。

因此,在JodaTime中,1月是第1个月,但在日历中,1月是0月。

因此,在您的示例中,您将 1月1日 2月1日进行比较,因此值的差异。

由于JodaTime被设置为零,但是日历对象不是。

,因此还存在毫秒差异。

答案 1 :(得分:13)

有两个原因:

  1. Joda有一个月的基础。所以你需要改变它。

  2. 日历设计不佳。您没有将秒的毫秒数设置为0. cal.set(MILLISECOND, 0)

  3. 这是javadoc

      

    public final void set(int year,                         int月,                         日期,                         int hourOfDay,                         int分钟,                         int second)

    缺少毫秒字段。

答案 2 :(得分:4)

从零开始与基于一种的符号

答案 3 :(得分:3)

我想在这里猜测Joda的1997, 01,01意味着 1997年1月1日

但是在Java Calendar中,几个月的编号从0到11,所以Java的1997,01,01 实际上是2月1日。

更好的方法是使用 -

cal.set(1997, Calendar.JANUARY, 01, 00,00,00);

当@Amir指出时,您还应该将Calendar对象的MILLISECONDS重置为0.