问题背景:

项目原来是在JDK1.5的环境下的,需要迁移到JDK1.8上运行。

原来环境下,用户前台输入年份,输入22-2-2格式,后台使用java.sql.Date.valueOf(String date)处理,处理完之后结果为:0022-02-02,会自动补全格式。

但是在JDK1.8的环境下,会报IllegalArgumentException异常。

问题原因:

通过调查,发现JDK1.5和JDK1.8在实现java.sql.Date.valueOf的时候,处理逻辑不同导致的问题出现。具体原因通过源码可以看出:

java.sql.Date.valueOf在JDK1.5和JDK1.8的实现差异

JDK1.5源码:

public static Date valueOf(String s) {

int year;

int month;

int day;

int firstDash;

int secondDash;

if (s == null) throw new java.lang.IllegalArgumentException();

firstDash = s.indexOf('-');

secondDash = s.indexOf('-', firstDash+1);

if ((firstDash > 0) & (secondDash > 0) & (secondDash < s.length()-1)) {

year = Integer.parseInt(s.substring(0, firstDash)) - 1900;

month = Integer.parseInt(s.substring(firstDash+1, secondDash)) - 1;

day = Integer.parseInt(s.substring(secondDash+1));

} else {

throw new java.lang.IllegalArgumentException();

}

return new Date(year, month, day);

}

可以看到只要判断年月日都有数据就不会报IllegalArgumentException异常。

JDK1.8源码:

public static Date valueOf(String s) {

final int YEAR_LENGTH = 4;

final int MONTH_LENGTH = 2;

final int DAY_LENGTH = 2;

final int MAX_MONTH = 12;

final int MAX_DAY = 31;

int firstDash;

int secondDash;

Date d = null;

if (s == null) {

throw new java.lang.IllegalArgumentException();

}

firstDash = s.indexOf('-');

secondDash = s.indexOf('-', firstDash + 1);

if ((firstDash > 0) && (secondDash > 0) && (secondDash < s.length() - 1)) {

String yyyy = s.substring(0, firstDash);

String mm = s.substring(firstDash + 1, secondDash);

String dd = s.substring(secondDash + 1);

if (yyyy.length() == YEAR_LENGTH &&

                    (mm.length() >= 1 && mm.length() <= MONTH_LENGTH) &&

                    (dd.length() >= 1 && dd.length() <= DAY_LENGTH)) {

int year = Integer.parseInt(yyyy);

int month = Integer.parseInt(mm);

int day = Integer.parseInt(dd);

if ((month >= 1 && month <= MAX_MONTH) && (day >= 1 && day <= MAX_DAY)) {

d = new Date(year - 1900, month - 1, day);

}

}

}

if (d == null) {

throw new java.lang.IllegalArgumentException();

}

return d;

}

1.8要精准匹配年份的长度必须为4的时候才会正常执行,不是4的时候,就会报IllegalArgumentException异常。

解决方案:

手动写一个DateUtils类,实现JDK1.5中的valueOf方法,全局替换java.sql.Date.valueOf方法即可。

java.sql.Date.valueOf处理日期格式IllegalArgumentException异常相关推荐

  1. java.sql.Date引发的日期格式转换错误

    记一次springboot开发中使用jackson进行时间格式化时,由于实体类定义的时间类型为java.sql.Date导致格式化转换错误 前端获取到的结果: 数据库存储的时间: 分析: java.s ...

  2. java比较时间sql_如何正确比较日期 java.sql.Date

    import java.sql.Date; ..... .... ... .. . 例如今天是2010-12-2 Date d1 = new Date(System.currentTimeMili() ...

  3. java.sql.Date日期比较

    import java.sql.Date; 例如今天是2010-12-2 Date d1 = new Date(System.currentTimeMili()); Date d2 = new Dat ...

  4. 【Java】日期字符串转换java.sql.Date对象

    日期字符串 → java.sql.Date对象 import java.text.ParseException; import java.text.SimpleDateFormat;public cl ...

  5. java sql date 加减_Java对日期Date类进行加减运算,年份加减,月份加减

    Date d=new Date(); SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); System.out.prin ...

  6. 如何将java.util.Date转换为java.sql.Date?

    我试图使用java.util.Date作为输入,然后用它创建一个查询-所以我需要一个java.sql.Date . 我很惊讶地发现它不能隐式或显式地进行转换-但我什至不知道该怎么做,因为Java AP ...

  7. java.util.Date和java.sql.Date

    java.util.Date是在除了SQL语句的情况下面使用的. java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分 它们都有getTime方法返回毫秒数,自然就可以直接构建 ...

  8. java date 转换sql date_java.util.Date和java.sql.Date之间的转换

    java.util.Date是在除了SQL语句的情况下面使用的. java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分 它 们都有getTime方法返回毫秒数,自然就可以直接构 ...

  9. java.util.Date和java.sql.Date的区别及应用

    ava.util.Date 就是在除了SQL语句的情况下面使用 java.sql.Date 是针对SQL语句使用的,它只包含日期而没有时间部分 它都有getTime方法返回毫秒数,自然就可以直接构建 ...

  10. java.util.Date和java.sql.Date的区别和相互转化

    java.util.Date: 是在除了SQL语句的情况下面使用的. java.sql.Date: 是针对SQL语句使用的,它只包含日期而没有时间部分. 它们都有getTime方法返回毫秒数,自然就可 ...

最新文章

  1. python subprocess库 终端命令行命令
  2. mixed content 混合内容
  3. js实现图片无缝循环跑马灯
  4. linux apt-get 源,Ubuntu应用之——apt-get更改源地址
  5. typecho 去掉index.php,typecho如何去掉index.php
  6. Java黑皮书课后题第6章:*6.16(一年的天数)使用下面的方法体编写一个方法,返回一年的天数。编写一个测试程序,显示从2000年到2020年间每年的天数
  7. MySQL高级 - 日志 - 查询日志
  8. 在.NET Core下的机器学习--学习笔记
  9. 设计模式示例_命令设计模式示例
  10. SEO技巧:好的域名是网站成功的开始
  11. 【项目管理】外包和采购
  12. excel教程自学网_我要自学网视频教程
  13. 蓝桥杯嵌入式板-解决LCD使LED亮灭混乱的办法
  14. 美国联邦政府2020财年网络安全预算分析:174亿美元如何分配?
  15. 单元测试——junit4入门例子
  16. 高数 07.04 多元复合函数的求导法则
  17. 小程序_OTA升级的一些情况说明
  18. 请每一个孝顺的子女耐心的看下去!
  19. 小米体脂秤2内部方案一览,附拆解维修记录
  20. linux mate主题目录,七大顶级Linux桌面:Cinnamon和MATE_服务器_服务器产业-中关村在线...

热门文章

  1. android高德地图热力图,没有编程基础也可通过高德地图完成炫酷的热力图分析...
  2. 谷歌火狐等浏览器Flash安装失败,安装后进入网站仍提示未安装Flash
  3. 双向循环链表的C++实现
  4. PCB 18种特殊走线的画法与技巧!
  5. cad在哪里设置图幅大小_CAD新建图纸怎么设置视图范围太小?
  6. 非科班无实习如何入职腾讯?后台开发岗个人校招学习路线分享!
  7. 思科防火墙ASA5506X总是自动重启查看crash日志
  8. ER Studio 使用笔记
  9. 卷积神经网络的几种模型
  10. 喵喵机器人--elasticsearch被入侵删库