Spring Boot中getAll()接口返回时间戳而非格式化日期的问题咨询
这其实不是你的代码实现有问题,而是Spring Boot中默认的日期序列化规则导致的,属于非常普遍的场景~
原因分析
当你的Java实体类中用Date、LocalDateTime这类日期类型映射MySQL的日期字段时,Spring默认使用Jackson进行JSON序列化。Jackson为了保证日期数据的通用性(跨语言、跨系统解析更稳定),会把日期对象默认序列化成毫秒级时间戳,也就是你看到的1519561301000,而不是数据库里展示的格式化字符串2018-02-25 20:10:29——毕竟数据库里的格式化只是存储的展示形式,Java程序拿到的是日期对象,序列化时遵循Jackson的默认规则。
解决方法
你可以通过几种方式让API返回格式化后的日期字符串:
1. 全局配置(推荐,统一所有日期字段格式)
在application.properties或application.yml中添加Jackson的日期格式化配置:
# application.properties spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
如果用YAML格式:
# application.yml spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
配置后,所有日期类型的字段都会按照指定格式返回字符串。
2. 局部字段注解(针对单个字段定制)
如果只想让creationdate字段返回格式化日期,在实体类的对应字段上添加@JsonFormat注解:
// 针对java.util.Date类型 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date creationdate; // 如果用Java 8的LocalDateTime @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime creationdate;
注意:如果使用Java 8的日期API(LocalDate/LocalDateTime等),需要确保项目中引入了jackson-datatype-jsr310依赖,Spring Boot的spring-boot-starter-web通常已经包含了这个依赖,如果没有的话可以手动添加。
3. 自定义序列化器(复杂场景使用)
如果有特殊的日期格式化需求(比如根据不同场景返回不同格式),可以自定义Jackson序列化器,然后通过@JsonSerialize注解绑定到字段上:
public class CustomDateSerializer extends StdSerializer<Date> { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public CustomDateSerializer() { this(null); } public CustomDateSerializer(Class<Date> t) { super(t); } @Override public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeString(sdf.format(value)); } }
然后在字段上使用:
@JsonSerialize(using = CustomDateSerializer.class) private Date creationdate;
总结
这种时间戳返回是Spring的默认行为,完全正常,你只需要根据自己的需求选择上面的一种方式调整序列化规则即可。
内容的提问来源于stack exchange,提问作者Deepak Jain

