JVM默認(rèn)時區(qū)為:Asia/Shanghai與java程序中GMT+08不一致異常
在Spring程序中配置了spring.jackson.time-zone=GMT+08時,部分時間相差一個小時問題,且是固定的時間出現(xiàn)了固定的時差問題。
經(jīng)過排查,發(fā)現(xiàn)是JVM的默認(rèn)時區(qū)為
Asia/Shanghai,兩者不一致,然后Asia/Shanghai 這個時區(qū)并不一定與GMT+08這個時區(qū)相等,他們是2種定義標(biāo)準(zhǔn)。
Asia/Shanghai 這個代表的是中國的時區(qū),但在歷史中,有國家(包含中國)政策頒布了在1986-1991年等還存在夏令時。
在這樣的時間區(qū)間,夏季時,會將時間撥快1個小時(即東9區(qū)時間),夏季結(jié)束時會再次將時間撥回一個小時(即東8區(qū)時間)。
所以要保證程序顯示的時間沒有問題,需要將JVM和spring.jackson.time-zone設(shè)置的時區(qū)保持一致即可解決問題。
JVM中設(shè)置為
Asia/Shanghai,經(jīng)代碼調(diào)試出現(xiàn)的底層時區(qū)調(diào)整的測試案例。
import java.text.SimpleDateFormat; import java.util.Date; /** * @author Ashen * @date 16/07/2019 */ public class Test { public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); static int[] offsets = { 28800000, 29143000, 32400000, 3600000 }; public static void main(String[] args) { test2(); } public static void test1(){ Date date0 = new Date(1986 - 1900, 07 - 1, 29); Date date1 = new Date(1980 - 1900, 07 - 1, 29); Date date2 = new Date(1988 - 1900, 07 - 1, 29); } public static void test2() { // 以下為JVM中時區(qū)為:Asia/Shanghai時的偏移量參數(shù)值(共9對,分別為9年夏令時的開啟與結(jié)束點) long transitions[] = { -9048018124799999L, -8918966038528000L, -3823593062399950L, -3781140480000000L, -3722379263999950L, -3651969024000000L, 2111569920000050L, 2158623129600000L, 2232955699200050L, 2287440691200000L, 2361773260800050L, 2416258252800000L, 2493068083200050L, 2547553075200000L, 2621885644800050L, 2676370636800000L, 2750703206400050L, 2805188198400000L, 8660385792000000L }; for(int i=0;i<18;i++){ Long longTime = transitions[i] >> 12; Long field2 = transitions[i] << 52 >> 60; Long field3 = transitions[i] << 56 >> 60; Long field4 = transitions[i] << 60 >> 60; Date date = new Date(longTime); System.out.println("時間"+getIndexStr(i)+": "+sdf.format(date)+" 保留值>>"+field2+" 日光節(jié)約量 >> "+getOffset(field3)+" GMT偏移量 >> "+getOffset(field4)); } } public static String getIndexStr(int i){ if(i<10) return "0"+i; else return String.valueOf(i); } public static String getOffset(long offset){ return offsets[(int)offset]/(1000 *60* 60)+"小時,"; } }
下面為運行結(jié)果:清晰的看到Asia/Shanghai 時區(qū)的調(diào)整時間點與調(diào)整量。
transitions[] 中的值來源于DEBUG程序時復(fù)制jvm中的數(shù)據(jù)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot實現(xiàn)國密SM4加密解密的使用示例
在商用密碼體系中,SM4主要用于數(shù)據(jù)加密,本文就來介紹一下SpringBoot實現(xiàn)國密SM4加密解密的使用示例,具有一定的參考價值,感興趣的可以了解一下2023-10-10JavaWeb學(xué)習(xí)筆記之Filter和Listener
這篇文章主要給大家介紹了關(guān)于JavaWeb學(xué)習(xí)筆記之Filter和Listener的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java多線程Future松獲取異步任務(wù)結(jié)果輕松實現(xiàn)
這篇文章主要為大家介紹了Java多線程Future松獲取異步任務(wù)結(jié)果輕松實現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04如何使用CountDownLatch同步j(luò)ava多線程
這篇文章主要介紹了如何使用CountDownLatch同步j(luò)ava多線程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08spring boot中使用RabbitMQ routing路由詳解
本篇文章主要介紹了spring boot中使用RabbitMQ routing路由詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03