使用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));
}
}
答案 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的情况显然不是这样。