序列化

假如有 Clock 类:

public class Clock {
private LocalDate localDate;
private LocalTime localTime;
private LocalDateTime localDateTime; // getter and setter
}

默认情况下, jackson序列化结果为:

{
"localDate": {
"year": 2017,
"month": "FEBRUARY",
"chronology": {
"calendarType": "iso8601",
"id": "ISO"
},
"era": "CE",
"dayOfYear": 57,
"dayOfWeek": "SUNDAY",
"leapYear": false,
"dayOfMonth": 26,
"monthValue": 2
},
"localTime": {
"hour": 17,
"minute": 33,
"second": 53,
"nano": 56000000
},
"localDateTime": {
"hour": 17,
"minute": 33,
"second": 53,
"nano": 56000000,
"dayOfYear": 57,
"dayOfWeek": "SUNDAY",
"month": "FEBRUARY",
"dayOfMonth": 26,
"year": 2017,
"monthValue": 2,
"chronology": {
"calendarType": "iso8601",
"id": "ISO"
}
}
}

简直不能直视...

在添加 JSR-310 模块后, 让 jackson 能够识别出 Java 8 的日期 & 时间类型(pom.xml):

<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

然后再启用 ISO 8601格式化标准 后效果就好多了(application.properties):

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

格式化效果:

{
"localDate": "2017-02-26",
"localTime": "17:42:54.141",
"localDateTime": "2017-02-26T17:42:54.141"
}

然而这中样式不太符合日常使用习惯, 还是需要通过注解或自定义序列化类的方式实现定制. 这里采用注解的方式实现:

public class Clock {
private LocalDate localDate; @JsonFormat(pattern = "HH:mm:ss")
private LocalTime localTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime; // getter and setter
}

格式化效果:

{
"localDate": "2017-02-26",
"localTime": "17:45:06",
"localDateTime": "2017-02-26 17:45:06"
}

这样就完美多了~

反序列化

上面只是序列化配置, 如果想提交日期参数还是配置一下:

public class Clock {
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate localDate; @JsonFormat(pattern = "HH:mm:ss")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
private LocalTime localTime; // @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime; // getter and setter
}

DateTimeFormat.ISO.DATE_TIME 的格式是 yyyy-MM-dd'T'HH:mm:ss.SSSZ(e.g. 2000-10-31T01:30:00.000-05:00), 不太符合使用习惯, 因此需要自定义 pattern.

测试接口:

@RestController
@EnableAutoConfiguration
public class HomeController {
@RequestMapping("/clock")
public Object deserialization(Clock clock) {
if (null == clock.getLocalDate()) {
clock.setLocalDate(LocalDate.now());
}
if (null == clock.getLocalTime()) {
clock.setLocalTime(LocalTime.now());
}
if (null == clock.getLocalDateTime()) {
clock.setLocalDateTime(LocalDateTime.now());
}
return clock;
}
}

当请求 URL http://localhost:8080/clock?localDate=2017-01-01&localDateTime=2017-01-01%2001:01:01 时, 结果为:

{
"localDate": "2017-01-01",
"localTime": "17:53:34",
"localDateTime": "2017-01-01 01:01:01"
}

源码

Github

PS: Java 8 LocalDate mapping with mybatis

参考链接:

序列化和反序列化Java 8的时间/日期类的更多相关文章

  1. Java中的时间日期处理

    程序就是输入——>处理——>输出.对数据的处理是程序员需要着重注意的地方,快速.高效的对数据进行处理时我们的追求.其中,时间日期的处理又尤为重要和平凡,此次,我将把Java中的时间日期处理 ...

  2. Java8 时间日期类操作

    Java8 时间日期类操作 Java8的时间类有两个重要的特性 线程安全 不可变类,返回的都是新的对象 显然,该特性解决了原来java.util.Date类与SimpleDateFormat线程不安全 ...

  3. 8.算法竞赛中的常用JAVA API :Calendar日期类

    8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...

  4. Linux 时间日期类、搜索查找类、 压缩和解压类指令

    l 时间日期类 date指令-显示当前日期 基本语法 1) date (功能描述:显示当前时间) 2) date +%Y (功能描述:显示当前年份) 3) date +%m (功能描述:显示当前月份) ...

  5. OC - 时间日期类NSDate

    OC - 时间日期类NSDate //NSDate 时间日期类 NSDate 二进制数据流 { //1.获取当前时间 零时区的时间 //显示的是格林尼治的时间: 年-月-日 时:分:秒:+时区 NSD ...

  6. 整理总结 python 中时间日期类数据处理与类型转换(含 pandas)

    我自学 python 编程并付诸实战,迄今三个月. pandas可能是我最高频使用的库,基于它的易学.实用,我也非常建议朋友们去尝试它.--尤其当你本身不是程序员,但多少跟表格或数据打点交道时,pan ...

  7. Linux时间日期类,压缩和解压类

    一.时间日期类 1.data指令 1.基本指令 date 显示当前日期 data +%Y 显示当前年份 data +%m 显示当前月份 data +%d 显示当前天 data +%Y-%m-%d %H ...

  8. linux学习之路第七天(时间日期类指令详解)

    时间日期类 1.date指令 date指令 - 显示当前日期 基本语法 1)date (功能描述:显示当前时间): 2) date + %Y (功能描述:显示当前年份) 3)date+%m( 功能描述 ...

  9. CentOS时间日期类语法

    目录 一.date时间日期类 1. date显示当前时间 2. date 显示非当前时间 3. date 设置系统时间 二.cal 查看日历 一.date时间日期类 date [OPTION]... ...

随机推荐

  1. LPD Office插件使用指南

    LPD Office插件已经发布至Azure上,您可以在本机Outlook和Office Online使用该插件 一:在Outlook中使用 LPD Office插件 打开Outlook应用,并点击“ ...

  2. HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))

    2018 Multi-University Training Contest 4 6333.Problem B. Harvest of Apples 题意很好懂,就是组合数求和. 官方题解: 我来叨叨 ...

  3. Problem C: 机器翻译【stl-队列】

    Problem C: 机器翻译 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 54  Solved: 27[Submit][Status][Web Bo ...

  4. 树状数组优化DP 【模拟赛】删区间

    哇,难受得一匹. 看到题的一瞬间竟然只想到了\(n^3\)的区间\(DP\) 一.\(40pts\) 设\(f[i][j]\)代表删去\(i\)到\(j\)这一段区间的最小代价和. 然后直接写普通的区 ...

  5. HDU 6315: Naive Operations

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  6. Python中类方法重载---大部分

    重载方法格式: def __xxx__(self,other): ... 注:重载方法格式------------------------------------------------------- ...

  7. AGC 025 B - RGB Coloring

    B - RGB Coloring Time limit : 2sec / Memory limit : 1024MB Score : 700 points Problem Statement Taka ...

  8. [SPOJ]COT2

    题意:给一棵带点权的树,多次询问两点间路径上的不同权值数 学习了一下莫队上树(雾 先求出栈入栈序$p_{1\cdots 2n}$,记$st_x$为$x$在$p$中第一次出现的位置,$ed_x$为$x$ ...

  9. 【三分】Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) B. The Meeting Place Cannot Be Changed

    三分显然,要注意EPS必须设成1e-6,设得再小一点都会TLE……坑炸了 #include<cstdio> #include<algorithm> #include<cm ...

  10. 打印不同的数 Exercise07_05

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:打印不同的数 * */ public class Exercise07_0 ...