java.util.Date在JDK 5和JDK 6中返回不同的日期

时间:2012-05-07 11:16:49

标签: java date time timezone

使用JDK5(1.5.0_09)运行时的以下代码

Fri May 03 00:00:00 GMT 3912 
5/3/12 5:30 AM

当使用JDK6(1.6.0_23)打印时

Fri May 03 00:00:00 IST 3912
5/3/12 12:00 AM

显然,差异是由于使用了时区,因此创建了Date对象。但是当JDK升级时,这不会导致现有代码出现问题吗?这种行为是在某处记录还是我遗漏了什么?

    class TimeTest {

    public static void main(String[] args) {

        Date d = new Date(2012, 04, 3);
        Locale l = new Locale("en", "US","");   
        DateFormat df= DateFormat.getDateTimeInstance(DateFormat.SHORT,  DateFormat.SHORT, l );
        TimeZone t = TimeZone.getTimeZone("Asia/Calcutta");
        df.setTimeZone(t);      
        System.out.println(d);
        System.out.println(df.format(d));

    }
}

1 个答案:

答案 0 :(得分:4)

奇怪的一年3192正在出现,因为已弃用 Date构造函数假设您使用的是2位数年份,0表示1900 。它将1900添加到年份编号。

时区的差异不是Date构造函数的错误。您的代码使用TimeZone.getTimeZone("Asia/Calcutta")来获取时区。该方法为documented,如果它无法识别时区字符串,则返回GMT时区。看起来Sun添加了对Java 1.6中更多时区的支持。 (大多数人认为这是一件好事而不是可移植性问题。)

我还没有尝试过,但是当您请求的区域ID无法识别时,以下内容应该足以让您自己不要使用GMT。

    public TimeZone getZone(String id) {
        TimeZone tz = TimeZone.getTimeZone();
        if (!tz.getID().equals(id)) {
            throw new IllegalArgumentException("unrecognized zone " + id);
        }
        return tz;
    }    

总之,您的代码在两个方面被打破:

  • 它使用的是不推荐使用的构造函数。
  • 假设 getTimeZone将理解您所有的时区字符串,而Java 1.5的情况显然不是这样。