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



使用 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));
    }
}

>奇怪的年份3192之所以出现,是因为该已弃用Date构造函数假设您使用的是具有0含义1900的 2 位数年份。 它将1900添加到年号中。

时区的差异不是Date构造函数的错。 代码正在使用TimeZone.getTimeZone("Asia/Calcutta")来获取时区。 该方法被记录为返回 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显然不是这种情况。

相关内容

  • 没有找到相关文章

最新更新