序列化

假如有 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. hdu 2196(方法1:经典树形DP+方法2:树的直径)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. 服务端指南 数据存储篇 | 聊聊 Redis 使用场景(转)

    作者:梁桂钊 本文,是升级版,补充部分实战案例.梳理几个场景下利用 Redis 的特性可以大大提高效率. 随着数据量的增长,MySQL 已经满足不了大型互联网类应用的需求.因此,Redis 基于内存存 ...

  3. C# 通过串口发送短信

    手机短信群发作为企业日常通知,公告,天气预报等信息的一个发布平台,在于成本低,操作方便等诸多特点,成为企业通讯之首选.本文介绍短信的编码方式,AT指令以及用C#实现串口通讯的方法. 前言目前,发送短信 ...

  4. 第1天-html快速入门

    开发工具:HBuilder 创建项目: 在电脑本地磁盘创建项目目录,如"D:\project" 打开HBuilder,这个工具默认会创建一个项目,我们删掉即可,然后新建项目:&qu ...

  5. Linux CentOS下Python+robot framework环境搭建

    转载自:http://blog.sina.com.cn/s/blog_13cc013b50102vof1.html 操作系统环境:CentOS 6.5-x86_64 下载地址:http://www.c ...

  6. Mysql-库的基本操作

    一 .系统数据库 二 .创建数据库 三 .数据库相关操作 一. 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信 ...

  7. [转]iOS ARC机制 weak strong

    写在开头 虽然距离WWDC2011和iOS 5已经快一年时间,但是很多开发者并没有利用新方法来提高自己的水平,这点在ARC的使用上非常明显(特别是国内,基本很少见到同行转向ARC).我曾经询问过一些同 ...

  8. Linux批量管理工具Ansible

    Ansible-批量linux管理工具:https://github.com/ansible/ansible Ansible有如下优点: 1.轻量级,他不需要去客户端安装agent,更新时,只需要在操 ...

  9. MetaWeblog是什么

    MetaWebBlog API(MWA)是一个Blog程序接口标准,允许外部程序来获取或者设置Blog的文字和熟悉.他建立在XMLRPC接口之上,并且已经有了很多的实现. 所以现在很多博客系统都支持这 ...

  10. IIS8集成模式下打开静态资源被aspx处理程序处理,StaticFileModule失效问题分析

    问题描述: 打开js,css,jpg之类的静态资源文件触发了asp.net mvc的权限认证,并不是直接返回静态内容 问题分析: StaticFileModule 失效 ,可能是文件权限问题 问题解决 ...