### 问题描述
想知道如何在以下场景中正确的使用LocalDateTime/LocalDate/LocalTime
项目前不久升级到Java8了, 新的业务模块都是采用Java8的语法或者API来实现, 比如Date
这个对象, 在Java8中, 我们就用了新的LocalDate
LocalDateTime
LocalTime
来替代.
今天在实现需求的时候, 需要修改一个RESTFul API接口, 新增了一个日期字段. 数据库中存储用的timestamp
, 代码中用的是LocalDateTime
, 格式为yyyy-MM-dd HH:mm:ss
.
但是前台展示以及编辑的时候, 用的是yyyy年MM月dd日
的格式.
将LocalDateTime
通过jackson转为yyyy年MM月dd日
是没有问题的.
但是将前端传回的字符串, 再通过jackson反序列化为LocalDateTime
对象时, jackson因为调用LocalDateTime
的实现导致报错.
因为jackson最终会使用
public static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) {
Objects.requireNonNull(formatter, "formatter");
return formatter.parse(text, LocalDateTime::from);
}
这个方法, 其中LocalDateTime::from
的实现为
public static LocalDateTime from(TemporalAccessor temporal) {
if (temporal instanceof LocalDateTime) {
return (LocalDateTime) temporal;
} else if (temporal instanceof ZonedDateTime) {
return ((ZonedDateTime) temporal).toLocalDateTime();
} else if (temporal instanceof OffsetDateTime) {
return ((OffsetDateTime) temporal).toLocalDateTime();
}
try {
LocalDate date = LocalDate.from(temporal);
// 这一行因没有时间戳传入,导致报错
LocalTime time = LocalTime.from(temporal);
return new LocalDateTime(date, time);
} catch (DateTimeException ex) {
throw new DateTimeException("Unable to obtain LocalDateTime from TemporalAccessor: " +
temporal + " of type " + temporal.getClass().getName(), ex);
}
}
因为没有时间, 这就导致在运行
LocalTime time = LocalTime.from(temporal);
这行代码的时候, 程序就会报错, 最终Spring认定这个请求无效, 后台返回400
此外我也尝试使用jackson对LocalDate
的实现, 当然这种骚操作也是不行的.
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDateTime someDateTime;
### 你期待的结果是什么?实际看到的错误信息又是什么?
用Date
太久了, 使用LocalDateTime
编程感觉有些许“水土不服”, 不知道各位有无方法能帮助一下我, 感谢!