springboot springmvc 時區 相差八小時 一小時 夏令時 GMT+8 GMT+08 GMT%2B8 Asia/Shanghai @DateTimeFormat spring.jackson.date-format



1、只管json格式提交和全局返回json時的格式,如果要單獨控制某一個時間字段的返回格式使用@JsonFormat(pattern = "HH:mm:ss")

spring:
    jackson:
        date-format: yyyy-MM-dd HH:mm:ss

如果不配置,json方式提交參數時默認的時間格式如下:
yyyy-MM-dd'T'HH:mm:ss.SSSZ
yyyy-MM-dd'T'HH:mm:ss.SSS, EEE
dd MMM yyyy HH:mm:ss zzz
yyyy-MM-dd

2、管時區(不管是form表單提交還是json提交)

spring:
    jackson:
        time-zone: Asia/Shanghai

在Spring程序中配置了spring.jackson.time-zone=GMT+08時,部分時間相差一個小時問題,且是固定的時間出現了固定的時差問題。
經過排查,發現是JVM的默認時區為:Asia/Shanghai,兩者不一致,然后Asia/Shanghai 這個時區並不一定與GMT+08這個時區相等,他們是2種定義標准。Asia/Shanghai 這個代表的是中國的時區,但在歷史中,有國家(包含中國)政策頒布了在1986-1991年等還存在夏令時。在這樣的時間區間,夏季時,會將時間撥快1個小時(即東9區時間),夏季結束時會再次將時間撥回一個小時(即東8區時間)。
所以要保證程序顯示的時間沒有問題,需要將JVM和spring.jackson.time-zone設置的時區保持一致即可解決問題

用GMT+8前端傳1987-05-01 00:00:00,然后再返回給前端會少一個小時。
同樣的如果是使用MySQL數據庫也會遇到此問題,所以網上很多說連接后面加上serverTimezone=GMT%2B8是不可靠的,改為serverTimezone=Asia/Shanghai就行了

3、只管form-data和x-www-form-urlencoded方式提交

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

如果不配置,form表單提交默認的時間格式如下:
yyyy/MM/dd
yyyy/MM/dd HH:mm:ss

4、只管form表單日期提交格式化,下面的方法加到受spring管理的bean里面去,最直接的方式加到main方法類里面

@Bean
public Converter<String, Date> dateConvert() {
    return new Converter<String, Date>() {
        @Override
        public Date convert(String source) {
            String value = source.trim();
            if ("".equals(value)) {
                return null;
            }
            if (source.matches("^\\d{4}-\\d{1,2}$")) {
                return parseDate(source, "yyyy-MM");
            } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
                return parseDate(source, "yyyy-MM-dd");
            } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
                return parseDate(source, "yyyy-MM-dd HH:mm");
            } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
                return parseDate(source, "yyyy-MM-dd HH:mm:ss");
            } else if (source.matches("^\\d{4}/\\d{1,2}$")) {
                return parseDate(source, "yyyy/MM");
            } else if (source.matches("^\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
                return parseDate(source, "HH:mm:ss");
            } else if (source.matches("^\\d{1,2}:\\d{1,2}$")) {
                return parseDate(source, "mm:ss");
            } else if (source.matches("^\\d{4}/\\d{1,2}/\\d{1,2}$")) {
                return parseDate(source, "yyyy/MM/dd");
            } else if (source.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
                return parseDate(source, "yyyy/MM/dd HH:mm");
            } else if (source.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
                return parseDate(source, "yyyy/MM/dd HH:mm:ss");
            } else {
                throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
            }
        }
    };
}

/**
 * 格式化日期
 *
 * @param dateStr String 字符型日期
 * @param format  String 格式
 * @return Date 日期
 */
public Date parseDate(String dateStr, String format) {
    Date date = null;
    try {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        date = simpleDateFormat.parse(dateStr);
    } catch (Exception e) {

    }
    return date;
}

綜上總結
一、不管什么方式傳參都加上時區統一配置:

spring:
    jackson:
        time-zone: Asia/Shanghai

二、只用json格式接收參數(@RequestBody注解方式)
1、全局統一:

spring:
    jackson:
        date-format: yyyy-MM-dd HH:mm:ss

2、多個時間字段格式各樣:
在字段上添加如下主節
@JsonFormat(pattern = "HH:mm:ss")
pattern自定義取值如下(前端高興就好)
yyyy-MM-dd HH:mm:ss
yyyy/MM/dd HH:mm:ss
yyyy-MM-dd
yyyy/MM/dd
HH:mm:ss
mm:ss
yyyy-MM-dd'T'HH:mm:ss.SSSZ(樣例:2020-05-28T22:35:12.000+0800)
yyyy-MM-dd'T'HH:mm:ss.SSS, EEE(樣例:2020-05-28T22:35:12.000, 星期四)
dd MMM yyyy HH:mm:ss zzz(樣例:28 五月 2020 22:35:12 CST)


三、只用form表單提交
1、返回格式統一:
配置文件添加

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss

時間字段上添加
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
pattern自定義取值如下(前端高興就好)
yyyy-MM-dd HH:mm:ss
yyyy/MM/dd HH:mm:ss
yyyy-MM-dd
yyyy/MM/dd
HH:mm:ss
mm:ss
yyyy-MM-dd'T'HH:mm:ss.SSSZ(樣例:2020-05-28T22:35:12.000+0800)
yyyy-MM-dd'T'HH:mm:ss.SSS, EEE(樣例:2020-05-28T22:35:12.000, 星期四)
dd MMM yyyy HH:mm:ss zzz(樣例:28 五月 2020 22:35:12 CST)

2、參數格式和返回格式不統一

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "HH:mm:ss")

兩個pattern自定義取值如上所述

3、重寫Converter方式,代碼如上所述

四、json方式和form表單方式混合在用
配置文件添加:

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: Asia/Shanghai

時間字段上添加:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")

如果json方式要控制自由格式可將配置中的date-format去掉,然后再字段上添加如下注解:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

兩個pattern自定義取值如上所述

 


免責聲明!

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



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