2014-04-16 21 views
1

我正在测试使用常量创建的日期的相等性,以及由于某些原因测试都失败。静态创建日期不相等?

public static Date date(int year, int month, int date, int hour, int minute) { 
    Calendar working = GregorianCalendar.getInstance(); 
    working.set(year, month, date, hour, minute, 1); 
    return working.getTime(); 
} 

如果我创建具有相同的年,月,日,小时等那么我希望它是相等的。除了它不一致。我在两个不同的类中使用此函数,并且对象不相等 - 除了有时

这是什么问题?它给我的时代偶尔会落后一秒,我不完全确定为什么。

+3

您如何进行比较?你可以在测试失败的地方给代码吗? –

+1

你如何做比较? –

+0

如果日期不同,以毫秒为单位,如果您将它们与毫秒精度进行比较,日期将不相同。 – mareckmareck

回答

2

getTime是毫秒精度,您只设置为第二精度。因此,当您使用.equals()方法比较日期时,它将返回false。

停止使用java日期时间API的憎恶,并使用jodatime来代替。

DateTime dateTime = new DateTime().secOfDay().roundFloorCopy(); 
dateTime.equals(myOtherDateTimeCreatedSameway); 

或者如果您只是担心日期而不是时间,请使用LocalDate。

+0

你已经解释了这个问题,但还没有显示出解决方案。你可以请张贴代码来解决这个问题吗? – Gabe

+0

@加贝圆满的毫秒,看到更新 – NimChimpsky

1

旧的日历-API无疑是一般的可怕的,但我展示了一种可能的解决方案,它可以抑制构造函数中生成的毫秒部分。只要你不改变时区,这将工作。所以有时候,Calendar-API被低估,而JodaTime往往被高估。

public static Date date(int year, int month, int date, int hour, int minute) { 
    // current time in system timezone 
    GregorianCalendar working = new GregorianCalendar(); 

    // assuming you rather want second set to zero 
    working.set(year, month, date, hour, minute, 0); 

    // no millisecond part 
    working.set(Calendar.MILLISECOND, 0); 
    return working.getTime(); 
}