java.sql.Date.valueOf处理日期格式IllegalArgumentException异常
问题背景:
项目原来是在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异常相关推荐
- java.sql.Date引发的日期格式转换错误
记一次springboot开发中使用jackson进行时间格式化时,由于实体类定义的时间类型为java.sql.Date导致格式化转换错误 前端获取到的结果: 数据库存储的时间: 分析: java.s ...
- java比较时间sql_如何正确比较日期 java.sql.Date
import java.sql.Date; ..... .... ... .. . 例如今天是2010-12-2 Date d1 = new Date(System.currentTimeMili() ...
- java.sql.Date日期比较
import java.sql.Date; 例如今天是2010-12-2 Date d1 = new Date(System.currentTimeMili()); Date d2 = new Dat ...
- 【Java】日期字符串转换java.sql.Date对象
日期字符串 → java.sql.Date对象 import java.text.ParseException; import java.text.SimpleDateFormat;public cl ...
- java sql date 加减_Java对日期Date类进行加减运算,年份加减,月份加减
Date d=new Date(); SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); System.out.prin ...
- 如何将java.util.Date转换为java.sql.Date?
我试图使用java.util.Date作为输入,然后用它创建一个查询-所以我需要一个java.sql.Date . 我很惊讶地发现它不能隐式或显式地进行转换-但我什至不知道该怎么做,因为Java AP ...
- java.util.Date和java.sql.Date
java.util.Date是在除了SQL语句的情况下面使用的. java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分 它们都有getTime方法返回毫秒数,自然就可以直接构建 ...
- java date 转换sql date_java.util.Date和java.sql.Date之间的转换
java.util.Date是在除了SQL语句的情况下面使用的. java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分 它 们都有getTime方法返回毫秒数,自然就可以直接构 ...
- java.util.Date和java.sql.Date的区别及应用
ava.util.Date 就是在除了SQL语句的情况下面使用 java.sql.Date 是针对SQL语句使用的,它只包含日期而没有时间部分 它都有getTime方法返回毫秒数,自然就可以直接构建 ...
- java.util.Date和java.sql.Date的区别和相互转化
java.util.Date: 是在除了SQL语句的情况下面使用的. java.sql.Date: 是针对SQL语句使用的,它只包含日期而没有时间部分. 它们都有getTime方法返回毫秒数,自然就可 ...
最新文章
- python subprocess库 终端命令行命令
- mixed content 混合内容
- js实现图片无缝循环跑马灯
- linux apt-get 源,Ubuntu应用之——apt-get更改源地址
- typecho 去掉index.php,typecho如何去掉index.php
- Java黑皮书课后题第6章:*6.16(一年的天数)使用下面的方法体编写一个方法,返回一年的天数。编写一个测试程序,显示从2000年到2020年间每年的天数
- MySQL高级 - 日志 - 查询日志
- 在.NET Core下的机器学习--学习笔记
- 设计模式示例_命令设计模式示例
- SEO技巧:好的域名是网站成功的开始
- 【项目管理】外包和采购
- excel教程自学网_我要自学网视频教程
- 蓝桥杯嵌入式板-解决LCD使LED亮灭混乱的办法
- 美国联邦政府2020财年网络安全预算分析:174亿美元如何分配?
- 单元测试——junit4入门例子
- 高数 07.04 多元复合函数的求导法则
- 小程序_OTA升级的一些情况说明
- 请每一个孝顺的子女耐心的看下去!
- 小米体脂秤2内部方案一览,附拆解维修记录
- linux mate主题目录,七大顶级Linux桌面:Cinnamon和MATE_服务器_服务器产业-中关村在线...
热门文章
- android高德地图热力图,没有编程基础也可通过高德地图完成炫酷的热力图分析...
- 谷歌火狐等浏览器Flash安装失败,安装后进入网站仍提示未安装Flash
- 双向循环链表的C++实现
- PCB 18种特殊走线的画法与技巧!
- cad在哪里设置图幅大小_CAD新建图纸怎么设置视图范围太小?
- 非科班无实习如何入职腾讯?后台开发岗个人校招学习路线分享!
- 思科防火墙ASA5506X总是自动重启查看crash日志
- ER Studio 使用笔记
- 卷积神经网络的几种模型
- 喵喵机器人--elasticsearch被入侵删库