为什么此测试失败:
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
它们不应该是相同的数字吗?
答案 0 :(得分:22)
日历基于零个月,JodaTime月份字段从1开始。
因此,在JodaTime中,1月是第1个月,但在日历中,1月是0月。
因此,在您的示例中,您将 1月1日与 2月1日进行比较,因此值的差异。
由于JodaTime被设置为零,但是日历对象不是。
,因此还存在毫秒差异。答案 1 :(得分:13)
有两个原因:
Joda有一个月的基础。所以你需要改变它。
日历设计不佳。您没有将秒的毫秒数设置为0. cal.set(MILLISECOND, 0)
这是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.