随笔—记由于SpringBoot中Mysql用了CST时区、实体类使用了Local时间类型导致问题的解决办法

4,941 阅读1分钟

0. 主要内容:

0.1 解决问题

  • 解决SpringBoot使用localDateTime、LocalDate这些类导致在配置文件中用dateFormat不生效的问题
  • 解决SpringBoot+Mybatis由于由于服务器时区为CST而导致的Mybatis获取出来的日期获取过后加了12的问题

0.1 运行环境

  • 本机 MacOS 10.14
  • 数据库 Mysql 5.7
  • 服务器 CentOS 7
  • SpringBoot 2.1.7.RELEASE
  • Mybatis: starter版本 2.1.0

1. 在SpringBoot中使用LocalDateTime的正确""姿势""

  • 我喜欢先说正确的

1.1 配置文件

spring:
  jackson:
    # timeZone: GMT+8 无效参数
    # dateFormat: yyyy-MM-dd HH:mm:ss 也是无效的

1.2 依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.7</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.7</version>
</dependency>
  • 上面第一个包就不说了
  • 第二个包是用来支持JSR310的数据类型的,我们可以理解用于Jackson支持为Local类型的时间的

1.3 配置类

@Configuration
public class LocalDateConfig {

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

    /**
     * 添加自定义
     * @return Jackson2ObjectMapperBuilderCustomizer
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder
                .serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT)))
                .serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)))
                .serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)))
                .deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT)))
                .deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)))
                .deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
    }

}  
  • 设置完毕
  • 运行项目就可以看到API返回的LocalDateTime数据变为:yyyy-MM-dd HH:mm:ss 格式的了。

1. Mysql使用CST时区,SpringBoot与之对应的正确方法:

  • 很简单 就是在连接地址上加上时区,但是这个时区不是GMT+8
  • 而是如下:
spring:
  datasource:
    druid:
      url: jdbc:mysql://server.address:3306/ilss_blog?useSSL=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  • 你没看错,就是Asia/Shanghai

  • 这个可以填的值可以在 /usr/share/zoneinfo 目录下,但是你不可以直接填Asia或者直接填Shanghai你需要填Asia/Shanghai 从zoneinfo的相对路径开始填

  • 是不是很简单!你去试试吧。

  • 感谢不知道看了哪些博客的主人。