商业网站建设费用,安徽中擎建设公司网站,南京市高淳县建设厅网站,wordpress通过标签调用文章前言 日期使用问题主要是格式转换的问题 场景#xff1a;通过excel导入数据#xff0c;其中一个字段为出生日期#xff0c;需要对字段值进行合法性校验 博客地址#xff1a;芒果橙的个人博客 【http://mangocheng.com】 一、个人浅谈日期
时间日期作为一个基础的标识和维度…前言 日期使用问题主要是格式转换的问题 场景通过excel导入数据其中一个字段为出生日期需要对字段值进行合法性校验 博客地址芒果橙的个人博客 【http://mangocheng.com】 一、个人浅谈日期
时间日期作为一个基础的标识和维度基本上所有的业务都会涉及到因此凡是涉及到业务的数据表都可能会加上类似创建时间、操作时间的字段。在程序开发中前端、后端、数据库在进行数据的传递过程中对于时间的格式就存在要求这部分也正是问题的触发点即格式的转换。 二、日期格式转换遇到的问题
1. 场景通过excel导入数据其中一个字段为出生日期需要对字段值进行合法性校验
2. 使用过程
1使用SimpleDateFormat进行日期转化如果抛出异常则说明填入的出生日期有误
1. 日期的分隔符不同
try {String birthDate 2000-12-31;SimpleDateFormat format new SimpleDateFormat(yyyy/MM/dd);format.parse(birthDate);System.out.println(日期正常);} catch (ParseException e) {System.out.println(日期格式有误);}输出日期格式有误 原因格式不对输入的分割符为 - 转化的格式为 /
2. 非法日期
// 出生日期为12月32日
try {String birthDate 2000-12-32.replaceAll(-,/);SimpleDateFormat format new SimpleDateFormat(yyyy/MM/dd);format.parse(birthDate);System.out.println(日期正常);} catch (ParseException e) {System.out.println(日期格式有误);e.printStackTrace();}输出日期正常原因后面说明重点虽然是12月32日但并不会抛出异常当时是很奇怪的怎么会是正常的但我没有多想觉得是不是SimpleDateFormat本身的转化存在缺陷于是我想着换另一个工具类
2使用apache的org.apache.commons.lang3.time.DateUtils
非法日期
try {String birthDate 2000-12-32.replaceAll(-, );SimpleDateFormat format new SimpleDateFormat(yyyyMMdd);org.apache.commons.lang3.time.DateUtils.parseDate(birthDate,yyyyMMdd);System.out.println(日期正常);} catch (ParseException e) {System.out.println(日期格式有误);}输出日期正常原因与1相同我再次认为是本身工具类的问题于是我选择了用公司封装的工具类
3使用公司的日期工具类
非法日期
try {String birthDate 2000-12-32;birthDate DateUtils.formatDate(format.parse(birthDate));System.out.println(日期正常);} catch (ParseException e) {System.out.println(日期格式有误);}输出日期格式有误原因非法日期没有12月32日用公司的工具类就正常其他第三方的工具类反而有错于是我搜索了下终于明白了原来日期转换有一个属性是lenient
3. 结论lenient属性是关键 lenient属性(默认为true)日期转换有一个属性是lenient——是否宽松转换不严格解析即如果输入的日期不合法但能转换为日期在不严格解析lenienttrue时不会抛出异常而是会自动计算出一个新的日期2000-12-32转换为2001-1-1 DateFormat源码DateFormat.parse() 测试 设置严格解析lenientfalse try {String birthDate 2000-12-32.replaceAll(-,/);SimpleDateFormat format new SimpleDateFormat(yyyy/MM/dd);// 严格解析format.setLenient(false);Date newDate format.parse(birthDate);System.out.println(日期正常);System.out.println(转化后的日期: newDate);} catch (ParseException e) {System.out.println(日期格式有误);}输出日期格式有误 SimpleDateFormat和org.apache.commons.lang3.time.DateUtils默认设置为不严格解析而刚好公司的工具类使用的日期格式器是spring框架的DateFormatter为严格解析 org.apache.commons.lang3.time.DateUtils spring框架的日期格式器类