用过的肯定知道,JSR310
的时间API真的是神器,极大的方便了在Java中对时间操作的过程。
JSR 310规范领导者Stephen Colebourne就是joda-time作者,其主要思想也是借鉴了joda-time,而不是直接把joda-time移植到Java平台中,API是类似的,但做了改进,具体的改进请参考其2009年的一篇文章和InfoQ对他的采访:
http://blog.joda.org/2009/11/why-jsr-310-isn-joda-time_4941.html
http://www.infoq.com/cn/news/2010/05/jsr-310
东西是挺好,平常时候直接用就行了,毕竟这个也能自由的跟旧的Date等API转换,虽然写起来会略啰嗦,如:
LocalDateTime nowLocalDateTime = LocalDateTime.now();
Date nowDate = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
不过为了更方便的操作时间也能忍了。
可毕竟是新东西,在之前做项目的时候就遇到了这么两个问题。
与Spring Data JPA
结合
我想在Spring Data JPA
(以下简称JPA
,但注意JPA
其实是一种规范)中的@Entity
实体类中将LocalDateTime
作为属性的类型来使用,如:
@Entity
public class Product {
...
@Column
private LocalDateTime gmtCreate;
...
}
结果问题来了,当时具体抛什么异常忘记了,大概是什么无法反序列化之类的,总之就是没法用。
其实很简单,熟悉JPA的应该已经想到了,要用上javax.persistence.AttributeConverter
了,网上也有不少自己实现这个转化器的文章,而Spring Data JPA后续也已经有了针对JSR310
的实现也即org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters
。
而如果你是Spring Boot项目的话,用起来就超级简单了,只需要在启动类上增加一个注解,将Jsr310JpaConverters
注册为Bean就可以实现用LocalDateTime
作为实体类的属性类型了。注解如下:
@EntityScan(basePackageClasses = {Jsr310JpaConverters.class})
与Jackson
结合
后端的问题解决了,可当前端用到的时候,却又出现了问题,具体抛出什么异常我也给忘了([捂脸]),大概还是不能反序列化之类的吧。
求助搜索引擎后了解到,原来Jackson默认也是没有兼容JSR310
的时间API的,所以这时候需要引入对应的Jackson
的相关模组(那个关键类就叫com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
),如果是使用Gradle
的话也就是引入如下依赖:
compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
OK,完美搞定~