Springboot时区处理

首先,我们需要知道我们为什么要设置时区

这是因为Jackson在序列化Date类型时,默认会使用系统时区(中国是GMT+8)进行转换。

假设数据库中存储的时间是:2024-02-28 14:00:00

 转换过程:

1. 从数据库读取:2024-02-28 14:00:00

 2. Java中Date对象内部存储为时间戳(UTC)

3. Jackson序列化时,会将UTC时间转换为本地时区(GMT+8)

4. 结果:2024-02-28 06:00:00(比数据库时间少8小时)

下面是解决方案!!

在SpringBoot中有多种方式可以更改查询结果中的时间格式:

1. 使用 @JsonFormat 注解(推荐)

public class User {
    // 格式化日期输出
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    
    // 或者 LocalDateTime
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}

2. 使用 @DateTimeFormat 注解(入参格式化)

public class User {
    // 入参时间格式化
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthDay;
}

3. 全局配置(application.yml)(推荐)

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  datasource:
    url:jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai

4. 配置类方式

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        return objectMapper;
    }
}

5. 不同日期类型的处理

public class DateExample {
    // java.util.Date
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date utilDate;
    
    // java.sql.Date
    @JsonFormat(pattern = "yyyy-MM-dd")
    private java.sql.Date sqlDate;
    
    // LocalDateTime
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime localDateTime;
    
    // LocalDate
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate localDate;
    
    // LocalTime
    @JsonFormat(pattern = "HH:mm:ss")
    private LocalTime localTime;
}

6. 常用日期格式

public class DatePatterns {
    // 常用格式
    public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE = "yyyy-MM-dd";
    public static final String TIME = "HH:mm:ss";
    public static final String YEAR_MONTH = "yyyy-MM";
    public static final String CHINESE_DATE = "yyyy年MM月dd日";
    public static final String CHINESE_DATE_TIME = "yyyy年MM月dd日 HH时mm分ss秒";
}

7. MyBatis中的日期格式处理

<!-- MyBatis映射文件中的日期格式化 -->
<select id="getUser" resultType="com.example.entity.User">
    SELECT 
        id,
        username,
        DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') as createTime,
        DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%s') as updateTime
    FROM user 
    WHERE id = #{id}
</select>

注意事项

  • 如果只需要格式化个别字段,使用@JsonFormat
  • 如果需要全局配置,使用application.yml或配置类
  • 如果需要自定义复杂的格式化逻辑,使用自定义序列化器
  • 如果是处理前端传来的日期,使用@DateTimeFormat

希望对各位看官有所帮助,如果能得到您的一个赞,那就太荣幸了,下期见,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值