java – 将LocalDate和LocalDateTime序列化为Unix时间戳
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 将LocalDate和LocalDateTime序列化为Unix时间戳,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2377字,纯文字阅读大概需要4分钟。
内容图文
![java – 将LocalDate和LocalDateTime序列化为Unix时间戳](/upload/InfoBanner/zyjiaocheng/782/b55a0d9175974d3aa6c8c0958a5d460c.jpg)
我正在使用java.sql.Timestamp和java.util.GregorianCalendar来在Spring MVC应用程序中使用java.time.*新类.
所以我改变了每一个
private GregorianCalendar field;
至
private LocalDate field;
要么
private LocalDateTime field;
但现在在序列化这些bean时,它们会像这样序列化:
"field": {
"year": 1970,
"month": "JANUARY",
"dayOfMonth": 18,
"dayOfWeek": "SUNDAY",
"era": "CE",
"dayOfYear": 18,
"leapYear": false,
"monthValue": 1,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
},
我找到了其他问题的答案,提到为jackson-datatype-jsr310添加依赖关系并获得:
"field": [
1970,
1,
18
],
但是当我使用GregorianCalendar字段进行序列化时,我仍然需要一个unix时间戳:我怎样才能实现呢?我可以避免使用自定义序列化程序(和反序列化程序)吗?
这些与资源响应和请求主体(如POST,PUT等)相关,而不是与请求参数相关.
Jackson ObjectMapper的配置如下:
jacksonConverter.getObjectMapper().enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
jacksonConverter.getObjectMapper().disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
解决方法:
在JavaDoc到JavaTimeModule(包含在jackson-datatype-jsr310库中)中,我们可以阅读以下内容:
Most
java.time
types are serialized as numbers (integers or decimals as appropriate) if theSerializationFeature.WRITE_DATES_AS_TIMESTAMPS
feature is enabled […][…] If
SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS
is disabled, timestamps are written as a whole number of milliseconds. […]
然后:
Some exceptions to this standard serialization/deserialization rule:
- […]
LocalDate
,LocalTime
,LocalDateTime
, andOffsetTime
, which cannot portably be converted to timestamps and are instead represented as arrays whenWRITE_DATES_AS_TIMESTAMPS
is enabled.
您确实可以看到LocalDateTime无法无处不在地转换为Unix时间戳,因为其toEpochSecond方法将ZoneOffset作为参数.
总而言之,您可以做的最好的事情就是用Instant替换LocalDateTime(有关LocalDateTime和Instant之间差异的解释,请参阅this great answer).
除此之外,你确实需要自定义JsonSerializer和JsonDeserializer.
这是一个有效的代码示例:
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
Entity entity = new Entity(Instant.now());
StringWriter writer = new StringWriter();
objectMapper.writeValue(writer, entity);
System.out.println(writer.getBuffer());
}
@lombok.Value
static class Entity {
Instant timestamp;
}
内容总结
以上是互联网集市为您收集整理的java – 将LocalDate和LocalDateTime序列化为Unix时间戳全部内容,希望文章能够帮你解决java – 将LocalDate和LocalDateTime序列化为Unix时间戳所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。