Java日期轉換註解配置date format時間失效

引言

今天生產上突然出現瞭列表日期錯誤,與數據庫實際差瞭8個小時;

這下可尷尬瞭,之前迭代都是正常,肯定是那裡出幺蛾子瞭,一頓排除,原來是新添加攔截器繼承WebMvcConfigurationSupport導致date-format時間格式失效瞭。

順帶學習瞭一下@JsonFormat和@DateTimeFormat的用法:

註解@JsonFormat主要是後臺到前臺的時間格式的轉換

註解@DateTimeFormat主要是前後到後臺的時間格式的轉換

一、@DateTimeFormat

主要解決前端時間控件傳值到後臺接收準確的Date類屬性的問題,我們可以在需要接收的類中對應的時間類型屬性上加上@DateTimeFormat註解,並在註解中加上pattern屬性。

// 出生年月日 
@DateTimeFormat(pattern = "yyyy-MM-dd HH-mm-ss") 
private Date birthday;

二、@JsonFormat

該註解主要解決後臺從數據庫中取出時間類型賦予java對象的Date屬性值無法在前端以一定的日期格式來呈現,默認返回的是一個帶時區的格式串,不符合我們日常要呈現的yyyy-MM-dd格式的日期。 同樣,我們在對應的接收對象時間類型上加上@JsonFormat註解,並在註解中加上pattern屬性以及timezone屬性,例如:

// 出生年月日
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;

pattern:是你需要轉換的時間日期的格式

timezone:是時間設置為東八區,避免時間在轉換中有誤差;GMT+8表示我們以東八區時區為準。

三、application.yml文件配置

1、數據庫配置時區serverTimezone=Asia/Shanghai或者serverTimezone=GMT%2B8

解決mysql從數據庫查詢的時間與實際時間相差8小時:

spring.datasource.url=jdbc:mysql://10.35.105.25:3306/database?characterEncoding=utf-8&serverTimezone=GMT%2B8

2、配置spring.jackson

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

四、SpringBoot攔截器

SpringBoot攔截器SpringBoot攔截器繼承WebMvcConfigurationSupport導致date-format時間格式失效

1、解決辦法不繼承WebMvcConfigurationSupport,修改為實現WebMvcConfigurer接口

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Resource
    private JwtInterceptor jwtInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtInterceptor)
                //攔截所有url
                .addPathPatterns("/**")
                //排除登錄url
                .excludePathPatterns("/", "/login");
    }
}

2、另外還有方式就是引入fastjson替換jackson

3、也可以繼承WebMvcConfigurationSupport重寫configureMessageConverters,自定義轉換器處理日期類型轉換

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
            .dateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
            .serializationInclusion(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL);
    converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
    converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}

以上就是Java日期轉換註解配置date format時間失效的詳細內容,更多關於Java日期轉換註解配置的資料請關註WalkonNet其它相關文章!

推薦閱讀: