序列化和反序列化Java 8的时间/日期类
序列化
假如有 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"
}
源码
PS: Java 8 LocalDate mapping with mybatis
参考链接:
序列化和反序列化Java 8的时间/日期类的更多相关文章
- Java中的时间日期处理
程序就是输入——>处理——>输出.对数据的处理是程序员需要着重注意的地方,快速.高效的对数据进行处理时我们的追求.其中,时间日期的处理又尤为重要和平凡,此次,我将把Java中的时间日期处理 ...
- Java8 时间日期类操作
Java8 时间日期类操作 Java8的时间类有两个重要的特性 线程安全 不可变类,返回的都是新的对象 显然,该特性解决了原来java.util.Date类与SimpleDateFormat线程不安全 ...
- 8.算法竞赛中的常用JAVA API :Calendar日期类
8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...
- Linux 时间日期类、搜索查找类、 压缩和解压类指令
l 时间日期类 date指令-显示当前日期 基本语法 1) date (功能描述:显示当前时间) 2) date +%Y (功能描述:显示当前年份) 3) date +%m (功能描述:显示当前月份) ...
- OC - 时间日期类NSDate
OC - 时间日期类NSDate //NSDate 时间日期类 NSDate 二进制数据流 { //1.获取当前时间 零时区的时间 //显示的是格林尼治的时间: 年-月-日 时:分:秒:+时区 NSD ...
- 整理总结 python 中时间日期类数据处理与类型转换(含 pandas)
我自学 python 编程并付诸实战,迄今三个月. pandas可能是我最高频使用的库,基于它的易学.实用,我也非常建议朋友们去尝试它.--尤其当你本身不是程序员,但多少跟表格或数据打点交道时,pan ...
- Linux时间日期类,压缩和解压类
一.时间日期类 1.data指令 1.基本指令 date 显示当前日期 data +%Y 显示当前年份 data +%m 显示当前月份 data +%d 显示当前天 data +%Y-%m-%d %H ...
- linux学习之路第七天(时间日期类指令详解)
时间日期类 1.date指令 date指令 - 显示当前日期 基本语法 1)date (功能描述:显示当前时间): 2) date + %Y (功能描述:显示当前年份) 3)date+%m( 功能描述 ...
- CentOS时间日期类语法
目录 一.date时间日期类 1. date显示当前时间 2. date 显示非当前时间 3. date 设置系统时间 二.cal 查看日历 一.date时间日期类 date [OPTION]... ...
随机推荐
- Hydra--密码破解的神器
原来不止burpsuit.sqlmap是神器,还有Hydra. 虽久闻大名,却未曾使用,今天偶然用到,发现支持的服务那真是多,ftp.ssh.smtp.imap.http...,而且支持ssl 可以想 ...
- HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)
6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...
- 水流(water)(BFS)(DFS)
水流(water) 时间限制: 1 Sec 内存限制: 64 MB提交: 9 解决: 2[提交][状态][讨论版] 题目描述 全球气候变暖,小镇A面临水灾,于是你必须买一些泵把水抽走.泵的抽水能力 ...
- SQL*Loader-605: Non-data dependent ORACLE error occurred — load discontinued
It seems the tablespace is full.
- 【秦九韶算法】【字符串哈希】bzoj3751 [NOIP2014]解方程
在模意义下枚举m进行验证,多设置几个模数,而且小一些,利用f(x+p)%p=f(x)%p降低计算次数.UOJ AC,bzoj OLE. #include<cstdio> #include& ...
- 【权值分块】bzoj3224 Tyvj 1728 普通平衡树
权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能. 部分操作的时间复杂度: 插入 删除 全局排名 全局K大 前驱 后继 全局最值 按值域删除元素 O(1) O(1) O(sqrt(n ...
- STL之vector3
描述 将n个数字输入到vector里,并对其进行从大到小排序并输出. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { vector<int> vec ...
- 使用openssl生成密钥、加密和签名
openssl genrsa -out rsakey.pem 1024 //生成1024bit的RSA密钥,并保存到rsakey.pem,此处未对密钥进行加密 openssl genrsa -aes ...
- TCP Socket一些东西
1. 若connect失败该套接字不可再用,必须close当前套接字,重新调用socket. 手册上注明连接失败后, socket的状态是未知的, 所以再次connect, 可能成功, 也可能失败. ...
- Inno Setup入门(十四)——替换安装程序和卸载程序的图标
通常Inno生成的安装文件的图标是一个光盘和显示器,如下图.同时,程序安装好之后,在安装目录下的卸载程序的图标也是一样的,其实我们也可以自己修改. 首先生成的安装文件图标.这个比较简单,只需要在Set ...