使用 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显然不是这种情况。