这篇文章主要介绍了JVM默认时区为:Asia/Shanghai与java程序中GMT+08不一致异常问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
在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设置的时区保持一致即可解决问题。
JVM中设置为
Asia/Shanghai,经代码调试出现的底层时区调整的测试案例。
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中时区为:Asia/Shanghai时的偏移量参数值(共9对,分别为9年夏令时的开启与结束点)
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+" 日光节约量 >> "+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)+"小时,";
}
}
下面为运行结果:清晰的看到Asia/Shanghai 时区的调整时间点与调整量。
transitions[] 中的值来源于DEBUG程序时复制jvm中的数据。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程学习网。
本文标题为:JVM默认时区为:Asia/Shanghai与java程序中GMT+08不一致异常


基础教程推荐
- 工厂方法在Spring框架中的运用 2023-06-23
- 一文了解Java 线程池的正确使用姿势 2023-06-17
- Java File类的概述及常用方法使用详解 2023-05-18
- JVM分析之类加载机制详解 2023-04-06
- 用java实现扫雷游戏 2022-12-06
- Project Reactor源码解析publishOn使用示例 2023-04-12
- SpringBoot配置文件中密码属性加密的实现 2023-03-11
- 全局记录Feign的请求和响应日志方式 2023-01-09
- Java使用EasyExcel进行单元格合并的问题详解 2023-01-18
- Java去掉小数点后面无效0的方案与建议 2023-02-18