JSR310新日期API(二)-日期时间API 前提 这篇文章主要介绍一下日期时间API中最常用的类库,分别是: java.time.Clock:时钟。
System.out.println(cal.getTime());//Fri Nov 17 12:00:00 CST 2017 System.out.println(cal.get(Calendar.MONTH));//10 JSR310 java8 datetime api 带来了什么 旧时代的时间api,在java.util 包中,而JSR310的类都在 java.time 包中。 LocalTime; 既有日期又有时间,则使用 LocalDateTime; 改善了jdk的TimeZone,使用更优雅的ZoneId; 增加了 Instant 的概念,可以理解为时间线上的一个瞬间; 很重要的,jsr310 JSR310 标准中的每一个时间对象,都是线程安全的。 每一个对象都没有公开的构造器,如果需要一个对象你首先想的不是 new,而是静态工厂方法: now、of、from。 请习惯链式语法。
最近刚好有新项目使用到JSR-310(JDK8)中引入的新日期API,打算做一下总结。本文编写基于JDK11,部分API可能是JDK9之后新增的。
这篇文章主要介绍JSR-310中日期时间类的常用计算工具,包括常规的两个日期时间实例之间的前后比较、间隔的时间量等等。
前面的几篇文章已经基本介绍完了JSR-310日期时间类库的基本使用,这篇文章主要介绍在主流的框架中如何使用这些类库。因为涉及到数据库操作,先准备好一张表和对应的实体。
前一篇文章已经比较详细地介绍了JSR-310中新增的常用的日期时间类,在实际应用中,我们也十分关注这些日期时间类的格式化操作,更加通俗来说就是字符串和日期时间类的相互转换问题。下面先回顾一下Java旧有的日期时间类和字符串之间的转换方案,然后重点分析JSR-310中新增的常用的日期时间类和字符串之间的转换方案。
LocalDateTime date = LocalDateTime.from(df.parse("2017-10-11 22:22:22")); SpringMVC Spring4版本之后默认对JSR310 DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Mybatis mybatis中数据库字段对应的实体类时间也是默认使用Date类型不做改变,而是提供了针对jsr310
系列文章: JSR310新日期API(一)-时区与时间偏移量 JSR310新日期API(二)-日期时间API JSR310新日期API(三)-日期时间格式化与解析 JSR310新日期API(四)-日期时间常用计算工具 JSR310新日期API(五)-在主流框架中使用新日期时间类 不经意间,JDK8发布已经超过6年了,如果还在用旧的日期时间API,可以抽点时间熟悉一下JSR-310的日期时间API。
但是随着Java8中的JSR310日期的普及,我预言joda必将走向死亡(毕竟亲儿子才是最好的)。因此本文涉及到joda的实现都略过,只看JSR310标准实现。 YearFormatter/MonthFormatter 他们的实现都很简单,都是调各自的parse()和toString()方法~ 就不详细说明了 DateFormatter 注意处理Java8中JSR310 // @since 3.0 // 处理java.util.Date 和JSR310无关 public class DateFormatter implements Formatter<Date> { 总的来说是支持了数值和日期类型(Date和JSR310、甚至joda) NumberFormatAnnotationFormatterFactory 处理@NumberFormat对数字进行格式化。 extends TemporalAccessor>) fieldType, formatter); } } 有了它,我们处理Date、JSR310之类的日期能达到统一的效果了。
不止如此,还有如下的一些使用不方便的地方 ---- 其实JSR310的规范领导者Stephen Colebourne,同时也是Joda-Time的创建者,JSR310是在Joda-Time的基础上建立的 ,参考了绝大部分的API,但并不是说JSR310=JODA-Time,还是有好些区别的 Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期累,此外用于格式化和解析的类在 的日期 首先你需要引入对应的Jar(这是很多人不知道怎么支持的最重要原因) <-- 让Mybatis支持JSR310 --> <dependency> <groupId SpringBoot2.0以上版本,不需要自己再额外导入SpringMVC的那个JSR310依赖的jar,因为默认就自带了 如果你的Mybatis版本在3.4.0以上,导包就支持。 IllegalStateException("Unsupported TemporalAccessor type: " + this.temporalAccessorType); } } 我发现JSR310
Validation 1.1(JSR-349)到SpringMVC Spring4新特性——Groovy Bean定义DSL Spring4新特性——更好的Java泛型操作API Spring4新特性——JSR310
jsr310.deser. jsr310.deser. jsr310.ser. jsr310.ser. jsr310.ser.
--而该模块JSR310支持到了时间类型的序列化、反序列化--> <dependency> <groupId>com.fasterxml.jackson.datatype
<version>${jackson.version}</version> </dependency> 注: jackson-datatype-jsr310这是用来支持jsr310
<version>${jackson.version}</version> </dependency> 注: jackson-datatype-jsr310这是用来支持jsr310
此模块能够访问构造函数和方法参数的名称 jackson-datatype-jdk8 除了Java8的时间API外其它新特性的的支持 jackson-datatype-jsr310 用以支持Java8新增的JSR310
解决 最后我找到的解决方式 就是因为这句话 使Jackson支持JSR310标准 然后最后导入了下面这个依赖: <dependency> <groupId>com.fasterxml.jackson.datatype
toOffsetDateTime(); } return value; } 修复 最开始我其实并不想改源码,我在想其他的实现方案,搜索后发现引入一个包就可以解决,也就是 mybatis 的 JSR310
此模块能够访问构造函数和方法参数的名称 jackson-datatype-jdk8 除了Java8的时间API外其它新特性的的支持 jackson-datatype-jsr310 用以支持Java8新增的JSR310
com.fasterxml.jackson.datatype.jsr310.JavaTimeModule", this.moduleClassLoader); // TODO: 默认加载jsr310