java.sql.Date.valueOf 使用注意事项


最近在帮同事解决了一个日期格式化的问题,总结如下,以飨读者。

java.sql.Date.valueOf()方法提供了把yyyy-mm-dd类型字符串转换成java.sql.Date类型的功能。但是在使用的时候有以下注意事项:

  1. valueOf参数必须是一个有效日期的yyyy-mm-dd格式类型的日期。
    在jdk1.4中,valueOf的参数可以设置为0000-00-00,jdk能够正确转换,不出现异常。但是在jdk 6中,使用该参数时提示IllegalArgumentException异常。修改为0001-01-01正常。
  2. valueOf参数必须严格符合yyyy-mm-dd格式。
    修正之前的代码通过Calendar类获得年月日,这时获得的年月日都是int类型的, 当月份和日小于10的时候是一位的,此时JDK源码中判断月、日位数的检查生效,不会再进行转换,直接抛出IllegalArgumentException异常。通过Calendar类获取年月日之后,要对不足位的字段进行补位,保证能够正常转换。

题外话:关于第二点问题,同事很疑惑为什么之前可以,现在不可以了。阅读jdk源代码并结合Bug发生的时间来看,没问题的时间2010年12月下旬,此时月、日都是两位;而出问题的时间是2011年1月上旬,月、日都不足位。通过这个经验教训来看系统边界测试有时候是很有必要的。

Advertisements

3 thoughts on “java.sql.Date.valueOf 使用注意事项

  1. 您好·
    我的客户在使用程序的时候出现了这个问题,我的本机与客户的服务器上装的都是jdk6,只是版本不同,但是我在本地测试是没有这个问题的,客户那就有·如果按照您说的方法具体应该怎样设置呢·
    谢谢
    小弟QQ:455739700

    1. 问题重现的基本原则就是尽量保持一样的环境(运行环境、代码、测试数据等)。

      建议你把本机测试环境配置为客户相同环境然后做测试。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s