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自定義取值如上所述