LocalDatetime 与 mybatis、json的坑
总所周知,localdatetime是jdk8 推出的关于日期计算非常方便地一个类,一旦开始用上就欲罢不能。但是在使用的时候,坑还是蛮多的。
一、mybatis与LocalDatetime
如果直接将实体里面所有的Date类型换成LocalDatetime之后,运行程序是会报异常的。此时,可以加入以下依赖:
-
<dependency>
-
<groupId>org.mybatis</groupId>
-
<artifactId>mybatis-typehandlers-jsr310</artifactId>
-
<version>1.0.2</version>
-
</dependency>
在mybatis3,.4以上,加入该依赖即可生效。mapper等跟之前一样无需修改。
二、LocalDatetime与json
此处localdatetime转json用的是jackson,其他转json的工具未测
待转类:
-
public class MyTest {
-
-
private LocalDateTime now;
-
-
public LocalDateTime getNow() {
-
return now;
-
}
-
-
public void setNow(LocalDateTime now) {
-
this.now = now;
-
}
-
}
将该类实例直接转成json之后输出
-
{
-
"now" : {
-
"dayOfMonth" : 29,
-
"dayOfWeek" : "FRIDAY",
-
"dayOfYear" : 363,
-
"hour" : 23,
-
"minute" : 45,
-
"month" : "DECEMBER",
-
"monthValue" : 12,
-
"nano" : 128000000,
-
"second" : 10,
-
"year" : 2017,
-
"chronology" : {
-
"id" : "ISO",
-
"calendarType" : "iso8601"
-
}
-
}
-
}
这样一个时间显得有点琐碎。我们一般跟前端交互的时候,用的都是形如 yyyyMMdd HH:mm:ss 这样的格式。所以此时就需要转下格式
-
{
-
"now" : "2017-12-29 23:50:32"
-
}
这是时候,就需要使用到注解
作为接受参数时,使用
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
作为格式化输出时,需要使用
@JsonSerialize(using = LocalDateTimeSerializer.class)
三 奇怪的时间
有时候,使用json序列化之后的时间,会发现比传参的时间差距有几个小时.一开始感觉很奇怪,后来发现json序列化的时候指定时区为GMT+8之后,就不会出现该现象.