Spring boot 中 Date 在json和 DB之间格式设置

本文详细介绍了在SpringBoot项目中,如何使用两种方式将Date类型转换为JSON格式,以及如何通过注解配置不同日期格式。同时,讲解了如何使用@Temporal注解来控制Date类型在数据库中的存储形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先使用springboot开发网站时,经常会涉及到日期的形式,那么在代码中使用java.util.Date来转化为json格式的字符串,应该怎样转化呢?将Date类型存入数据库有应该怎样实现呢?

Date与json的相互转换 
实现Date转换为json格式,json格式转化为Date的方式总的来说有两种。

1.使用全局配置 
在application.properties配置文件中增加下面两个配置:

#时区设置
spring.jackson.time-zone=GMT+8
日期期时格式设置置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

这样配置下来的话所有需要与json字符串互转的Date格式都为:yyyy-MM-dd HH:mm:ss。 


下面我们在设置好后测试一下: 
其中测试类DateTest1的代码如下:

package com.JPAdemo.JPAdemo.modle;

import java.util.Date;


public class DateTest1 {
    private Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}


controller如下:

@GetMapping("/1")
    public DateTest1 test1(){
        DateTest1 dateTest1=new DateTest1();
        dateTest1.setDate(new Date());
        return dateTest1;
    }


运行后使用PostMan测试:

这里写图片描述

2.使用@Jsonformat、@datetimeformat两个注解局部设置。 
与全局配置相比较,使用这两个注解就更加的精细,只需要在你所需要的地方使用这两个注解即可,并且可以设置不同的时间格式。具体使用见下面的Demo: 
测试类DateTest2:

package com.JPAdemo.JPAdemo.modle;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;
public class DateTest2 {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date date1;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date date2;

    @DateTimeFormat(pattern = "HH:mm:ss")
    @JsonFormat(pattern = "HH:mm:ss")
    private Date date3;

    public DateTest2() {
    }

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public Date getDate2() {
        return date2;
    }

    public void setDate2(Date date2) {
        this.date2 = date2;
    }

    public Date getDate3() {
        return date3;
    }

    public void setDate3(Date date3) {
        this.date3 = date3;
    }
}


controller:

//测试Date与json格式的相互转换------局部注解
    @GetMapping("/2")
    public DateTest2 test2(){
        DateTest2 dateTest2=new DateTest2();
        dateTest2.setDate1(new Date());
        dateTest2.setDate2(new Date());
        dateTest2.setDate2(new Date());
        return dateTest2;
    }



运行结果: 

这里写图片描述

其中pattern 的值指定了Date与json字符串相互转化的格式。**当全局设置和局部设置同时使用时,局部设置会失效 
!!! 
** 
- Date在数据库中的存取 
Date在数据库中的存取,我还没有发现全局设置,目前发现只能通过注解@Temporal来实现。 
@Temporal的定义如以下所示:

public @interface Temporal {

    TemporalType value() default TIMESTAMP;

}

从定义可以看出,在使用@Temporal注解时,需要指定枚举类型TemType的值,如果不指定的话默认为TemporalType.TIMESTAMP,一共有三个可选的值:TemporalType.TIME、TemporalType.DATE、TemporalType.TIMESTAMP。具体的使用看下面的Demo: 
DateTest3:

package com.JPAdemo.JPAdemo.modle;

import org.springframework.web.bind.annotation.RequestMapping;

import javax.persistence.*;
import java.util.Date;


@Entity
public class DateTest3 {
    @Id
    @GeneratedValue
    private Integer id;

    //存取日期+时间
    @Temporal(TemporalType.TIMESTAMP)
    private Date date1;
    //存取时间
    @Temporal(TemporalType.TIME)
    private Date date2;
    //存取日期
    @Temporal(TemporalType.DATE)
    private Date date3;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public Date getDate2() {
        return date2;
    }

    public void setDate2(Date date2) {
        this.date2 = date2;
    }

    public Date getDate3() {
        return date3;
    }

    public void setDate3(Date date3) {
        this.date3 = date3;
    }
}


controller:

@Autowired
    DateTest3Repository dateTest3Repository;
    //测试Date在数据库中的存取
    @GetMapping("/3")
    public void test3(){
        DateTest3 dateTest3=new DateTest3();
        dateTest3.setDate1(new Date());
        dateTest3.setDate2(new Date());
        dateTest3.setDate3(new Date());
        dateTest3Repository.save(dateTest3);
    }


运行结果: 

这里写图片描述
需要注意的是,TemporalType的三个不同的枚举值对应着数据库中三中不同的时间字段类型,着可以通过在数据库中输入SHOW TABLE 表名 来查看它们分别对应的类型,正因为这些枚举值对应着不同的字段类型,换而言之,当修改其中的枚举值时,对应的表结构也会发生变化,如果你使用的JPA操作数据库的策略是:spring.jpa.hibernate.ddl-auto=update那么必须在修改了TemporalType的值之后删除原先已经创建的表,让JPA在数据库中从新创建表。否则,即使修改了值,根据update的策略,它并不会改变数据库中表中的字段类型,意味着修改无效。 
三种不同的枚举值对应者不同的MySQL中时间类型:

TemporalType.TIME--time、TemporalType.DATE--date、TemporalType.TIMESTAMP--datetime


表结构: 

这里写图片描述

<think>我们正在解决如何全局配置Spring Boot中Jackson的日期格式以避免时区问题。根据引用内容,我们可以通过配置属性或Java配置类来实现。 主要步骤: 1. 在application.properties(或application.yml)中配置Jackson的日期格式时区。 2. 如果使用Java配置类,可以创建一个ObjectMapper的Bean并设置日期格式时区。 引用中提供了两种方式: 引用[2]:在application.properties中配置 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=Asia/Shanghai 引用[3]:提到对于java.util包中的时间类型java.time包中的时间类型,需要分开配置。但实际上,通过全局配置Jackson的时区日期格式,可以同时影响这两种类型(前提是注册了相应的模块,如JavaTimeModule)。 引用[4][5]提到了一些注解,但我们现在需要全局配置。 另外,引用[1]说明: spring.jackson.time-zone:指定时区 spring.jackson.date-format:指定日期格式 spring.jackson.default-property-inclusion:指定序列化时包含的属性 同时,引用[5]提到,Spring Boot通过HttpMessageConverter使用Jackson进行序列化反序列化,因此配置Jackson的ObjectMapper即可。 因此,我们有两种方法: 方法一:配置文件(application.properties) spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=Asia/Shanghai 方法二:Java配置(创建一个配置类,定义ObjectMapper Bean) 这种方法更灵活,可以添加更多自定义设置。 注意:对于Java 8的时间类型(如LocalDateTime),需要确保已经注册了JavaTimeModule(Spring Boot自动配置中已经包含,但如果我们自定义ObjectMapper,则需要显式注册)。 下面分别给出两种方法的详细步骤:</think>### 在 Spring Boot 中全局配置 Jackson 日期格式避免时区问题 #### 📌 核心解决方案(配置文件方式) 在 `application.properties` 或 `application.yml` 中添加以下配置: ```properties # 设置日期格式(支持自定义格式spring.jackson.date-format=yyyy-MM-dd HH:mm:ss # 关键配置:指定时区为北京时间(UTC+8) spring.jackson.time-zone=Asia/Shanghai # 禁止将日期序列化为时间戳 spring.jackson.serialization.write-dates-as-timestamps=false ``` ```yaml # YAML 格式配置 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai serialization: write-dates-as-timestamps: false ``` #### ⚙️ Java 配置类方式(更灵活) 创建全局 Jackson 配置类: ```java @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 设置日期格式时区 JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer( DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") )); mapper.registerModule(javaTimeModule); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); mapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); return mapper; } } ``` #### 🔍 关键配置说明 | **配置项** | **作用** | **推荐值** | |------------------------------------------------|-------------------------------------------------------------------------|------------------------| | `spring.jackson.time-zone` | 解决时区偏移问题的核心配置,确保序列化/反序列化使用统一时区 | `Asia/Shanghai` | | `spring.jackson.date-format` | 定义日期字符串格式(需与前端传输格式一致) | `yyyy-MM-dd HH:mm:ss` | | `spring.jackson.serialization.write-dates-as-timestamps` | 禁用时间戳格式,强制使用字符串格式 | `false` | | `JavaTimeModule` | 支持 Java 8 时间类型(如 `LocalDateTime`)的关键模块 | 必需注册 | #### ⚠️ 注意事项 1. **时区一致性原则**: - 确保数据库连接时区与 Jackson 配置一致(JDBC URL 添加 `?serverTimezone=Asia/Shanghai`) - 前端传递时间字符串时建议包含时区信息(如 `2023-01-01T12:00:00+08:00`) 2. **日期格式覆盖规则**: - 全局配置会被 `@JsonFormat` 注解覆盖 ```java // 示例:注解优先级高于全局配置 public class User { @JsonFormat(pattern = "yyyy/MM/dd", timezone = "GMT+8") private Date birthDate; } ``` 3. **历史日期类型兼容**: - 同时使用 `java.util.Date` `java.time` 类型时需注册两个模块: ```java mapper.registerModules(new JavaTimeModule(), new Jdk8Module()); ``` #### 🌰 验证测试 配置后测试接口返回结果: ```json // 配置前(UTC时区,时间+8小时) {"createTime":"2023-01-01T16:00:00.000+00:00"} // 配置后(北京时间) {"createTime":"2023-01-01 08:00:00"} ``` > 📌 **最佳实践**:在微服务架构中,建议在网关层统一转换时区,避免每个服务重复配置[^1][^2][^4]。 --- ### 相关问题 1. **如何为不同接口定制不同的日期格式?** → 使用 `@JsonFormat` 注解覆盖全局配置,或自定义 `JsonSerializer` 实现 2. **Java 8 的 `LocalDateTime` 在序列化时遇到 `InvalidDefinitionException` 怎么办?** → 检查是否注册 `JavaTimeModule`,并禁用 `WRITE_DATES_AS_TIMESTAMPS` 3. **数据库存储时间比实际少 8 小时如何解决?** → 在 JDBC URL 添加时区参数:`jdbc:mysql://host/db?serverTimezone=Asia/Shanghai` 4. **如何同时支持多种日期格式解析?** → 实现自定义 `DateTimeFormatter` 或使用 `@DateTimeFormat` 注解 [^1]: [Spring Boot 时区配置文档](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.jackson-configure-date-format) [^2]: [Jackson 时区处理指南](https://www.baeldung.com/jackson-serialize-dates#serialization-1) [^4]: [Java 8 时间类型最佳实践](https://www.baeldung.com/spring-boot-formatting-json-dates)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值