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 类的源代码,我已经弄清楚出了什么问题。我找到了一个初始化为 {4,2,2} 的数组 intDate[] 并对照此检查日期中每个项目的长度数组。
现在为什么时间部分即使只有个位数也能正常工作?因为根据等效数组 intTime[] 检查长度的代码在源代码中被注释掉了。
JDK 5 中的 Timestamp 类没有任何这些检查,并且可以很好地处理此类输入。
我在官方网站的任何地方都没有发现这种奇怪的地方。虽然我发现另一个人有 same problem .这个问题很容易解决,我有兴趣找出 JDK 6 中发生的其他此类奇怪变化。
最佳答案
关于java - JDK 6 中的陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1595307/