【jackson序列化工具】全局格式化时间yyyy-MM-dd HH:mm:ss

【jackson序列化工具】全局格式化时间yyyy-MM-dd HH:mm:ss、反序列化枚举

一、格式化时间

格式化时间,也就是序列化时间,返回给前端展示的时间,一共有三种实现方式。

先看第一种:

1.1 yml配置

如果是springboot项目,则可以使用yml全局配置,简单粗暴

spring:
	jackson:
	  date-format: yyyy-MM-dd HH:mm:ss
	  time-zone: GMT+08

1.2 注解

第二种则是注解的方式,需要注意的是在每个需要序列化的类的时间字段上都要添加该注解,当然可以添加一个基类,让其它类继承这类就好了。

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")   //前台传入日期时间时定义时间存储的格式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 序列化时格式化时间
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime createTime;

1.3配置类的方式

请看代码

package com.example.start.conf;

import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import com.mimirii.smartgreenhouse.utils.Constants;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

/**
 * @description:
 * @author: luke on 2023/10/24
 * @version: 1.0
 */
@Configuration
public class LocalDateFormatConfig {


    /**
     * Date格式化字符串
     */
    private static final String DATE_FORMAT = DatePattern.NORM_DATE_PATTERN; //yyyy-MM-dd
    /**
     * DateTime格式化字符串
     */
    private static final String DATETIME_FORMAT = DatePattern.NORM_DATETIME_PATTERN; //yyyy-MM-dd HH:mm:ss
    /**
     * Time格式化字符串
     */
    private static final String TIME_FORMAT = "HH:mm"; //HH:mm

    @Bean
    @Primary
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT, Locale.CHINA)))
                .serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.CHINA)))
                .serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT, Locale.CHINA)))
                .deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT, Locale.CHINA)))
                .deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.CHINA)))
                .deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT, Locale.CHINA)));
    }

}

至此,三种序列化时间和反序列化时间的方法已经完成。

### 正确使用@JsonFormat注解以避免报错 在开发过程中,如果需要将 `LocalDateTime` 类型的字段格式化为特定的时间字符串(如 `"yyyy-MM-dd HH:mm:ss"`),并将其正确传递至前端显示,可以利用 Jackson 提供的 `@JsonFormat` 注解实现这一功能。然而,由于 `LocalDateTime` 不携带时区信息以及可能存在的依赖版本问题,可能导致注解失效或引发错误。 以下是关于如何正确使用 `@JsonFormat` 注解的具体说明: --- #### 1. **确保字段类型与注解匹配** 当使用 `@JsonFormat` 注解时,需注意字段类型的适用性。例如,`LocalDateTime` 是无时区信息的本地时间类型,而 `ZonedDateTime` 和 `OffsetDateTime` 则包含时区信息。如果希望对带有时区的时间进行处理,应改用后者[^1]。 示例代码如下: ```java import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; public class Event { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime eventTime; // Getter and Setter methods omitted for brevity. } ``` --- #### 2. **明确指定时区参数** 尽管 `LocalDateTime` 自身不存储时区信息,但在序列化和反序列化期间可通过 `timezone` 属性强制应用某一固定时区。这有助于统一前后端之间的时区差异[^2]。 需要注意的是,只有当底层 JSON 库支持该属性时,才能生效。例如,在较新的 Jackson 版本中,推荐使用 `zone` 替代旧版的 `timezone` 参数[^5]。 修改后的注解写法如下: ```java @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", zone = "GMT+8") private LocalDateTime eventTime; ``` --- #### 3. **检查 Jackson 依赖版本** 若发现 `@JsonFormat` 注解不起作用,可能是由于项目中引入了冲突的第三方库(如 FastJSON)。这些库可能会干扰 Jackson 的正常运行机制,从而导致注解失效[^5]。 推荐做法是清理不必要的依赖项,并升级 Jackson 至最新稳定版本(如 2.x 系列)。POM 文件中的 Maven 依赖配置示例如下: ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.16.0</version> </dependency> ``` --- #### 4. **全局配置日期时间格式** 如果项目中有大量涉及日期时间的操作,可考虑通过 Spring Boot全局配置文件简化重复劳动。例如,在 `application.yml` 中添加以下内容即可统一管理所有字段的默认格式[^3]: ```yaml spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 ``` 上述方法适用于大多数场景,但对于特殊需求仍需单独调整个别字段的行为。 --- #### 5. **测试与验证** 在完成以上修改之后,务必编写单元测试案例检验最终效果是否符合预期。下面是一个简单的 JUnit 测试片段: ```java import org.junit.jupiter.api.Test; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.time.LocalDateTime; public class JsonFormatTest { @Test public void testJsonFormat() throws IOException { ObjectMapper mapper = new ObjectMapper(); Event event = new Event(); event.setEventTime(LocalDateTime.now()); String jsonOutput = mapper.writeValueAsString(event); System.out.println(jsonOutput); // 输出结果应当满足指定格式 } } class Event { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", zone = "GMT+8") private LocalDateTime eventTime; public LocalDateTime getEventTime() { return eventTime; } public void setEventTime(LocalDateTime eventTime) { this.eventTime = eventTime; } } ``` --- ### 总结 为了有效防止因误用 `@JsonFormat` 导致的各种异常情况发生,请始终关注以下几个方面:一是合理选用适合业务逻辑的目标数据类型;二是严格按照官方文档指引设定必要的附加选项;三是定期审查外部依赖关系以免产生意外副作用。只要遵循上述原则,就能显著降低相关风险概率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值