JDK 6 中是否存在早期版本中不存在的问题?我有兴趣在 Timestamp.valueOf() 的工作方式中找出一些令人惊讶的变化,例如以下变化。
Timestamp.valueOf(),当提供包含单个数字的日期或月份的时间戳时。例如。2009-9-20、2009-9-3、2009-12-4 等在 JDK 6 中的行为不同 - 它抛出 IllegalArgumentException 表示时间戳格式不正确。而JDK 5(和更早的版本)工作得很好,提供了以'0'为前缀的正确值。
JDK 6 更加严格,因为该方法确实希望它的参数是 JDBC 时间戳转义格式的字符串。但是,这个 BREAKS 代码是用 JDK 5 编写的。
代码如:
String s = "2009-9-1 00:00:00";
Timestamp t = Timestamp.valueOf(s);
但是 JDK 6 可以将小时、分钟、秒设为个位数。通过查看 JDK 6 中 Timestamp 类的源代码,我找出了问题所在。我发现了一个数组 intDate[],它被初始化为 {4,2,2},并对照此检查日期中每个项目的长度大批。
现在为什么时间部分即使只有个位数也能正常工作?因为根据等效数组 intTime[] 检查长度的代码在源代码中已被注释掉。
JDK 5 中的 Timestamp 类没有任何这些检查,并且可以很好地处理这些输入。
我在官方网站的任何地方都没有发现这样的怪事。虽然我发现另一个人也有同样的问题。这个问题很容易解决,我有兴趣找出 JDK 6 中发生的其他此类奇怪的变化。