2011-07-26 70 views
11

为什么这个测试失败:为什么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

难道他们不应该是相同的数?

+0

你有使用八进制数的原因吗? – soc

回答

13

两个原因:

  1. 乔达具有基于一个个月。所以你需要改变它。

  2. 日历设计不佳。你是不是第二个的毫秒设置为0 cal.set(MILLISECOND, 0)

这里是javadoc的

公众最终无效集(INT年, 月整型, INT日期, INT HOUROFDAY, int minute, int second)

缺少毫秒字段。

+0

这也是为什么毫秒不匹配 –

+0

do'h!我也知道这一点......它总是让我感动。 – ryber

20

日历具有从零开始个月,JodaTime个领域开始于1

所以,在JodaTime,一月份是1月,但在日历,一月是一个月0

因此,在你的榜样您正在比较1月1日2月1日,因此值的差异。

还有一个毫秒的差异,因为JodaTime被设置为零,但Calendar对象不是。

3

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

但是在Java日历中,月份的编号从0到11,所以对于Java而言,1997,01,01 实际上是2月1日。

一个更好的办法是使用 -

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

你也应该重新设置日历对象的毫秒至0作为@Amir指出。

4

基于一个零基与符号

+2

+1,我喜欢直射手。 – Moonbeam

相关问题