繁体   English   中英

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

[英]java.util.Date returning different dates in JDK 5 and 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构造函数假定您使用的是2位数的年份,而0表示1900 它将1900添加到年份中。

时区的差异不是Date构造函数的错误。 您的代码使用TimeZone.getTimeZone("Asia/Calcutta")获取时区。 如果该方法无法识别时区字符串,则记录为返回GMT时区。 看起来Sun ADDED在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显然不是这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM