@JsonFormat 不起作用,日期数据返回毫秒数

今天遇到一个bug,后端一个接口返回给前端的json数据中,date类型字段返回的是毫秒数而不是格式化的日期数据,但其他接口是正常的。
在这里插入图片描述

实体类字段是这样的

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="Asia/Shanghai")
    private Date gmtCreate;

json转换是这样的

httpServletResponse.getWriter().write(JSON.toJSONString(responseJson));

排查了一会儿才发现是混淆了fastjson和jackson

import com.fasterxml.jackson.annotation.JsonFormat;

import com.alibaba.fastjson.JSON;

@JsonFormat是jackson的注解,而我这里调用的JSON对象是fastjson的,同时Springboot默认是使用jackson进行序列化,所以才导致仅仅是这一个接口出现了问题,而其他是正常的。疏忽大意了。

这里可以直接使用jackson进行初始化,但考虑fastjson的效率更高,我这次在项目中想尝试使用fastjson。很简单,只需要进行以下配置即可修改springboot默认json序列化工具。

1、注入fastjson消息转换对象

/**
 * @author LiMing
 * @date 2022/2/28 20:16
 */
@Configuration
public class HttpConverterConfig {
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        // 1.定义一个converters转换消息的对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        // 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json数据
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        // 3.在converter中添加配置信息
        fastConverter.setFastJsonConfig(fastJsonConfig);
        // 4.将converter赋值给HttpMessageConverter
        HttpMessageConverter<?> converter = fastConverter;
        // 5.返回HttpMessageConverters对象
        return new HttpMessageConverters(converter);
    }
}

2、在实体类字段上使用fastjson的注解

//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="Asia/Shanghai")
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date gmtCreate;
### 如何在Java中将日期转换为时间戳或字符串格式 #### 将 `java.util.Date` 转换为 `java.sql.Timestamp` 可以通过创建一个新的 `java.sql.Timestamp` 对象并将 `java.util.Date` 的毫秒传递给它来实现此操作。以下是具体的代码示例: ```java import java.sql.Timestamp; import java.util.Date; public class DateToTimestampExample { public static void main(String[] args) { // 创建一个当前时间的Date对象 Date utilDate = new Date(); // 使用utilDate的时间信息创建Timestamp对象 Timestamp sqlTimestamp = new Timestamp(utilDate.getTime()); System.out.println("Current Time as SQL Timestamp: " + sqlTimestamp); } } ``` 上述方法展示了如何从 `java.util.Date` 获取其毫秒表示形式,并将其用于构建新的 `java.sql.Timestamp` 实例[^1]。 #### 将 `java.util.Date` 转换为字符串格式 为了将 `java.util.Date` 类型的数据转换成特定格式的字符串,可以利用 `SimpleDateFormat` 或者更现代的方式如 `DateTimeFormatter` 来完成这一过程。下面是一个例子展示如何使用 `SimpleDateFormat` 进行这种转换: ```java import java.text.SimpleDateFormat; import java.util.Date; public class DateFormattingExample { public static void main(String[] args) throws Exception{ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String formattedDate = formatter.format(date); System.out.println(formattedDate); } } ``` 这里定义了一个指定模式 (`"yyyy-MM-dd HH:mm:ss"`) 的 `SimpleDateFormat` 对象用来格式化日期实例[^2]。 对于JSON序列化的场景下,则可能需要借助注解方式自动处理前端传入或者返回数据中的日期字段格式问题。例如通过设置 `@JsonFormat` 和 `@DateTimeFormat` 注解分别控制响应体和请求参里涉及的日期解析逻辑[^3]: ```java @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 返回时间类型 @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") // 接收时间类型 private Date startTime; ``` 另外,在JSP页面上也可以采用 JSTL标签库里的 `<fmt:formatDate>` 功能直接渲染模型属性对应的日期值到HTML界面当中去[^4]: ```jsp <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> ${needConvertValue} <fmt:formatDate value="${room.meeting_order}" pattern="yyyy-MM-dd"/> ``` 最后值得注意的是关于UNIX 时间戳的理解及其应用场合。通常来说十位字代表自UTC/GMT标准纪元起始以来所经历过的秒量;而十三位则意味着精确到了毫秒级别——这常见于某些基于JAVA平台的应用程序内部记录事件发生时刻的做法之中[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值