2016-08-17 43 views
-2

我遇到了Java 1.7的GregorianCalender问题。我知道转移到Java 8或使用Joda可能会解决我的问题,但不幸的是,这不是一个选项。Java 1.7 GregorianCalendar计算错误日期

所以我想增加365天来计算一个结束日期(这可能看起来很愚蠢,增加365天,而不仅仅是增加一年,但这是我的客户要求,甚至在问他很多次后,他想要坚持与它,因为他想忽略闰年)。

总的来说,所有的工作都很好,但在下面的单元测试中,它并不符合我和我的期望。我现在重新计算了几次,并使用各种工具来检查我的结果,但我无法确认java的计算结果。

这里是我的单元测试,这将失败,因为它返回一个错误的日期:

@Test 
public void test(){ 
    // Get a Gregorian Calendar 
    Calendar cal = GregorianCalendar.getInstance(); 

    // Remove whatever was stored previously 
    cal.clear(); 

    // Set calendar to 2004-10-23 
    cal.set(2004, Calendar.OCTOBER, 23); 

    // Add 365 days 
    cal.add(Calendar.DAY_OF_YEAR, 365); 

    // Calendar should be at 2005-10-22 now 
    Assert.assertEquals(2005, cal.get(Calendar.YEAR)); 
    Assert.assertEquals(Calendar.OCTOBER, cal.get(Calendar.MONTH)); 
    Assert.assertEquals(22, cal.get(Calendar.DAY_OF_MONTH)); 
} 

它将失败:

java.lang.AssertionError: expected:<22> but was:<23> 

难道我做错了什么?

回答

6

你从10月 2004年到2005年10月。没有闰年之间,因此该月的日子仍然是第23。现在,如果你想在2003年10月23日开始,那就不一样了。