隨筆—記因爲SpringBoot中Mysql用了CST時區、實體類使用了Local時間類型致使問題的解決辦法

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/Shanghaijava

  • 這個能夠填的值能夠在 /usr/share/zoneinfo 目錄下,可是你不能夠直接填Asia或者直接填Shanghai你須要填Asia/Shanghai 從zoneinfo的相對路徑開始填 mysql

  • 是否是很簡單!你去試試吧。spring

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


關於我

  • 座標杭州,普通本科在讀,計算機科學與技術專業,20年畢業,目前處於實習階段。
  • 主要作Java開發,會寫點Golang、Shell。對微服務、大數據比較感興趣,預備作這個方向。
  • 目前處於菜鳥階段,各位大佬輕噴,小弟正在瘋狂學習。
  • 歡迎你們和我交流鴨!!!
相關文章
相關標籤/搜索