为什么这个Java Calendar比较糟糕?

时间:2010-03-22 13:51:09

标签: java

当我尝试与日期进行比较时,我遇到了Java Calendar类的一个莫名其妙的问题。我想和Calendars比较 并确定它们的差异是否>超过1天,并根据这种差异做事。但它不起作用。

如果我这两个日期这样做:

    String currDate = aCurrentUTCCalendar.getTime().toString();
    String localDate = aLocalCalendar.getTime().toString();

我得到了这些结果:

    currDate  = "Thu Jan 06 05:58:00 MST 2010"
    localDate = "Tue Jan 05 00:02:00 MST 2010"

这是正确的。

但如果我这样做:

    long curr = aCurrentUTCCalendar.getTime().getTime();
    long local = aLocalCalendar.getTime().getTime();

我得到了这些结果:(自纪元以来的毫秒数)

    curr  = -125566110120000 
    local =  1262674920000 

由于两者之间只有大约30个小时的差异,因此幅度差异很大,更不用说恼人的负面了 登录。

如果我这样做会导致问题:

long day = 60 * 60 * 24 * 1000; // 86400000 millis, one day

if( local - curr > day )
{
    // do something
}

怎么了?为什么getTime()。toString()调用正确,但getTime()。getTime()调用有很大不同?

我在WinXP上使用jdk 1.6_06。我出于各种原因无法升级JDK。

3 个答案:

答案 0 :(得分:5)

你的currDate是“B.C.E. 2010-01-06”(Before Common Era),即4019(2x2010 - 1)年前。

试试这个:

public class StrangeDate {

  public static void main(String[] args) {
    Date d = new Date(-125566110120000L);
    System.out.println(d.toString());
    //prints 'Thu Jan 06 13:58:00 CET 2010' in my locale

    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.YEAR, 4019);

    System.out.println(c.getTime().toString());
    //prints 'Wed Jan 06 13:58:00 CET 2010' in my locale
  }

}

问题是:你做了什么才能得到这个aCurrentUTCCalendar

答案 1 :(得分:3)

也许打印“Tue 5”和“Thu 6”的事实表明你的日期创作出了问题?

ps:无关紧要,但是做了cal.getTime()。getTime(),你可以做cal.getTimeInMillis()

答案 2 :(得分:0)

答案是使用JodaTime类。感谢您的介绍,我更容易获得我想要的结果,而不是Java难以使用的东西。

我将此作为Java.Util.Date和Java.Util.Calendar类的一个奇怪之处。

感谢您的帮助。