这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆
❤️技术活,该赏
❤️点赞 👍 收藏 ⭐再看,养成习惯
看本篇文章前,建议先对java源码的日期和时间有一定的了解,如果不了解的话,可以先看这篇文章:
关联文章:
源码分析目的
知其然,知其所以然
项目引用
此博文的依据:hutool-5.6.5版本源码
1 | xml复制代码 <dependency> |
方法名称:DateUtil.parseLocalDateTime(java.lang.CharSequence)
方法描述
构建LocalDateTime对象
格式:yyyy-MM-dd HH:mm:ss
源码分析一
1 | java复制代码 /** |
parseLocalDateTime(CharSequence dateStr, String format)方法的format要使用DatePattern定义的格式,保证能解析出来。
来看看**LocalDateTimeUtil.parse(dateStr, format)**源码是如何写的:
1 | java复制代码//LocalDateTimeUtil |
注释里写着修复了JDK8 的一个bug bugs.openjdk.java.net/browse/JDK-…
试试:
1 | java复制代码 @Test |
真的会报错。
官方有给出解决方案,但在java9版本修复。下放到8u版本里。
所以hutool这边的写法就好理解了,这个是官方给出的解决方案:修复yyyyMMddHHmmssSSS格式不能解析的问题
1 | java复制代码//LocalDateTimeUtil |
最后调用parse(text, formatter);
1 | java复制代码/** |
首先好习惯,先判断入参是否为空处理。
1 | java复制代码LocalDateTime.parse(text)//返回LocalDateTime对象 |
都是java8 新提供的API:
最后使用**of(TemporalAccessor)**转化为LocalDateTime时间对象
首先来看下TemporalAccessor:
TemporalAccessor 的实现类包含
- Instant
- LocalDateTime
- ZonedDateTime
- OffsetDateTime
- LocalDate
- LocalTime
- OffsetTime
1 | java复制代码public static LocalDateTime of(TemporalAccessor temporalAccessor) { |
首先,由上面可知,LocalDate是temporalAccessor的实现类。((LocalDate)temporalAccessor).atStartOfDay()这个就可以变成LocalDate.atStartOfDay()
1 | java复制代码public LocalDateTime atStartOfDay() { |
LocalTime.MIDNIGHT:
1 | java复制代码 /** |
LocalDateTime是由LocalDate和LocalTime组合成的。
1 | java复制代码 public static LocalDateTime of(LocalDate date, LocalTime time) { |
然后,TemporalAccessorUtil.get(temporalAccessor, ChronoField.YEAR)这个是hutool的源码,我们来看看
1 | java复制代码 /** |
判断temporalAccessor是否有支持指定的字段,如果有,直接返回指定字段对应的时间值。如果没有,则执行
(int)field.range().getMinimum(),获取字段对应的最小值。
1 | java复制代码 System.out.println(ChronoField.YEAR.range().getMinimum()); |
year值初始化时设的最小值和最大值
本文转载自: 掘金