前言

日期使用问题主要是格式转换的问题
场景:通过excel导入数据,其中一个字段为出生日期,需要对字段值进行合法性校验
博客地址:芒果橙的个人博客 【http://mangocheng.com】

文章目录

  • 前言
  • 一、个人浅谈日期
  • 二、日期格式转换遇到的问题
    • 1. 场景:通过excel导入数据,其中一个字段为出生日期,需要对字段值进行合法性校验
    • 2. 使用过程
      • 1)使用SimpleDateFormat进行日期转化,如果抛出异常则说明填入的出生日期有误
      • 2)使用apache的org.apache.commons.lang3.time.DateUtils
      • 3)使用公司的日期工具类
    • 3. 结论:lenient属性是关键

一、个人浅谈日期

时间日期作为一个基础的标识和维度,基本上所有的业务都会涉及到,因此凡是涉及到业务的数据表,都可能会加上类似创建时间、操作时间的字段。在程序开发中,前端、后端、数据库在进行数据的传递过程中,对于时间的格式就存在要求,这部分也正是问题的触发点,即格式的转换。


二、日期格式转换遇到的问题

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

  1. 非法日期
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)使用公司的日期工具类

  1. 非法日期
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属性是关键

  1. lenient属性(默认为true):日期转换有一个属性是lenient——是否宽松转换(不严格解析),即如果输入的日期不合法,但能转换为日期,在不严格解析(lenient=true)时,不会抛出异常,而是会自动计算出一个新的日期(2000-12-32转换为2001-1-1)

  2. DateFormat源码:DateFormat.parse()

  1. 测试
  • 设置严格解析:lenient=false

    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框架的日期格式器类

程序中的日期使用问题-格式转化:SimpleDateFormat、org.apache.commons.lang3.time.DateUtils相关推荐

  1. 日期处理类org.apache.commons.lang3.time.DateUtils

    日期处理类org.apache.commons.lang3.time.DateUtils/*** 以秒为标准时间的毫秒数*/public static final long MILLIS_PER_SE ...

  2. Java中字符串工具类继承org.apache.commons.lang3.StringUtils类代码

    场景 转换为字节数组:是否包含字符串:替换掉HTML标签方法:替换为手机识别的HTML,去掉样式及属性,保留回车: 缩略字符串(不区分中英文字符):转换为Double类型:转换为Float类型:转换为 ...

  3. SimpleDateFormat 日期,时间格式转化

    SimpleDateFormat  一定要弄清楚 parse 与 format 不然总是遇到异常 就是使用不对的问题 parse()返回的是一个Date类型里面使用的String类型 format 返 ...

  4. sql中的日期和字符串的转化

    1 oracle 数据库中转化 日期的相关格式: 日期格式 YYYY 四位表示的年份 MM 01~12的月份编号 MONTH 九个字符表示的月份,右边用空格填补 MON 三位字符的月份缩写 WW 一年 ...

  5. 在JavaScript中以日期/月/年格式获取当前日期

    在JavaScript中获取当前日期 (Getting current date in JavaScript) To get the current date in JavaScript, we ne ...

  6. SpringMVC 中设置日期字符串转换格式

    2019独角兽企业重金招聘Python工程师标准>>> 在使用SpringMVC的项目中经常遇到 controller 参数中接收Date类型的数据,但是页面传过来的参数又是日期字符 ...

  7. Django中的日期和时间格式 DateTimeField

    创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ...

  8. django 后台日期_Django中的日期和时间格式 DateTimeField

    创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ...

  9. python时间格式转换为美式日期,Python中time日期、时间格式转换

    在我们日常的数据采集中,时间time的重要性毋庸置疑的,因为它是衡量采集到的信息是否具有正确时效性的唯一因素.如果我们采集到的信息对于客户来说已经是过期的信息,这对于客户没有使用的价值,影响客户使用. ...

最新文章

  1. mysqldump和xtrabackup备份原理实现说明
  2. [数据结构]表达式求值
  3. referer 访问控制
  4. 华为路由器固件_【卖萌推荐】路由器推荐第二期
  5. Laravel自定义验证规则的实例与框架使用正则实例
  6. 微软服务器在电脑上怎么打开,怎么在一个电脑上开启服务器可以让另外一台电脑连接服...
  7. 并行和并发有什么区别?
  8. 正能量:为web前端发开者代言
  9. DDD:一个朋友对领域驱动的小结
  10. 7款效果惊人的HTML5/CSS3应用
  11. 使用DirectX9进行遮盖剔除
  12. ROG幻14 AMD R7-4800H VM16安装macOS Catalina 10.15教程
  13. PMP学习系列5:PMBOK(5th)第三章-项目管理过程
  14. [C# 开发技巧]实现属于自己的截图工具
  15. Python(二):基本数据类型、序列的基本操作
  16. Oracle 数据脱敏
  17. 【操作系统】系统中断技术
  18. 悉尼大学计算机专业本科学费,悉尼大学
  19. “钢铁直猿”专属,5·20硬核表白方式三连击
  20. C++超市库存管理系统期末作业

热门文章

  1. 常见的http请求头以及响应头
  2. 商城优惠券模块设计与实现
  3. HTML基础-05-图片(引用图片src=“图片地址“、图片位置 align=“位置“、浮动图片 style=“float:位置“、图片链接 href=“目标url“、图形映射)
  4. python快速入门到精通详细教程
  5. 什么是序列图/时序图?
  6. 《林超:给年轻人的跨学科通识课》导图 05:脑科学模型
  7. fiddler官方文档
  8. 迁移学习(含代码示例)
  9. 企业实战-Docker(三)网络
  10. Python 闭包 (closure)深入解析