首頁 > 軟體

Java日期轉換註解設定date format時間失效

2022-12-13 14:00:20

引言

今天生產上突然出現了列表日期錯誤,與資料庫實際差了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日期轉換註解設定的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com