日期格式jackson格式化


最近公司項目遇到一個時間格式轉換問題,項目調用時包含了Date類型的時間返回值,報了一下錯誤

Cannot parse date "2021-11-19 11:59:39": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))

網上一般說加上以下配置

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8 #時差問題
    serialization:
      write_dates_as_timestamps: false

但是無奈項目四五十個,都是線上項目,加起來優點麻煩(有得項目加,有得項目沒加估計問題會更嚴重)

另外一種解決方案就是在字段上增加一下注解

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

這里也有一個問題,如果有得老項目格式不是這個格式呢,時間轉換豈不是又要出問題

最終想到的辦法是實現jackson日期的反序列化方法,對所有可能的日期格式做解析

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@JsonComponent
public class DateFormatConfig {
    private static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static final SimpleDateFormat SSSZ_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    /**
     * 日期序列化
     */
    public static class DateJsonSerializer extends JsonSerializer<Date> {
        @Override
        public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            if(date != null){
                jsonGenerator.writeString(DEFAULT_DATE_FORMAT.format(date));
            }
        }
    }
    /**
     * 日期反序列化
     */
    public static class DateJsonDeserializer extends JsonDeserializer<Date> {
        @Override
        public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            try {
                String text = jsonParser.getText();
                if(StringUtils.isEmpty(text)){
                    return null;
                }
                //時間戳格式
                if(text.length() == 13 || text.length() ==10){
                    return DEFAULT_DATE_FORMAT.parse(DEFAULT_DATE_FORMAT.format(Long.parseLong(text)));
                }
                //yyyy-MM-dd'T'HH:mm:ss.SSSZ
               if(text.contains("T") && text.contains("SSSZ")){
                    return SSSZ_DATE_FORMAT.parse(text);
                }
                //DEFAULT_DATE_FORMAT
                return DEFAULT_DATE_FORMAT.parse(text);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM