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

joe*_*pak 4 java

当我尝试与日期进行比较时,我遇到了Java Calendar类的一个无法解释的问题.我正在尝试与日历进行比较,并确定它们的差异是否超过1天,并根据这种差异做事.但它不起作用.

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

    String currDate = aCurrentUTCCalendar.getTime().toString();
    String localDate = aLocalCalendar.getTime().toString();
Run Code Online (Sandbox Code Playgroud)

我得到这些结果:

    currDate  = "Thu Jan 06 05:58:00 MST 2010"
    localDate = "Tue Jan 05 00:02:00 MST 2010"
Run Code Online (Sandbox Code Playgroud)

这是对的.

但如果我这样做:

    long curr = aCurrentUTCCalendar.getTime().getTime();
    long local = aLocalCalendar.getTime().getTime();
Run Code Online (Sandbox Code Playgroud)

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

    curr  = -125566110120000 
    local =  1262674920000 
Run Code Online (Sandbox Code Playgroud)

由于两者之间只有大约30个小时的不同,因此幅度差别很大,更不用说恼人的负号了.

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

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

if( local - curr > day )
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

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

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

For*_*ega 5

你的currDate是"BCE 2010-01-06"(普通时代之前),这是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
  }

}
Run Code Online (Sandbox Code Playgroud)

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