问题描述
本地时区是新加坡时区时,将小型long值,使用Java里date包转换或者前端js组件包转换时会有30分钟的误差
@Test
public void 测试耗时这种小型long值在新加坡时区下的问题() throws InterruptedException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startTime = new Date();
System.out.println("startTime: " + formatter.format(startTime));
System.out.println("startTime long: " + startTime.getTime());
Thread.sleep(1000);
Date endTime = new Date();
System.out.println("endTime: " + formatter.format(endTime));
System.out.println("endTime long: " + endTime.getTime());
System.out.println("endTime long转换成Date,和真实时间一致: " + formatter.format(new Date(endTime.getTime())));
long littleTimeLong = endTime.getTime() - startTime.getTime();
Date littleTime = new Date(littleTimeLong);
System.out.println("littleTimeLong: " + littleTimeLong);
System.out.println("littleTimeLong 转换成Date,新加坡时区(UTC+08:00)下和真实时间不一致,littleTime: " + formatter.format(littleTime));
}
北京时区(UTC+08:00)测试结果:
startTime: 2022-07-01 16:37:33
startTime long: 1656664653939
endTime: 2022-07-01 16:37:34
endTime long: 1656664654940
endTime long转换成Date,和真实时间一致: 2022-07-01 16:37:34
littleTimeLong: 1001
littleTimeLong 转换成Date,新加坡时区(UTC+08:00)下和真实时间不一致,littleTime: 1970-01-01 08:00:01
新加坡时区(UTC+08:00)测试结果,应该是和北京时区一样才对:
startTime: 2022-07-01 16:38:14
startTime long: 1656664694903
endTime: 2022-07-01 16:38:15
endTime long: 1656664695904
endTime long转换成Date,和真实时间一致: 2022-07-01 16:38:15
littleTimeLong: 1001
littleTimeLong 转换成Date,新加坡时区(UTC+08:00)下和真实时间不一致,littleTime: 1970-01-01 07:30:01
原因分析:
ps:demo里面的那个littleTime分界点,在这个历史原因里面应该也能找到答案,感兴趣同学可以深究下
解决方案:
耗时本来也没必要和时区扯上关系,自行根据时分秒换算规则转换就行。前端使用tools之类的组件,后端使用Date等包,都会获取当前时区做转换。实现时要注意。
可以参考:java把秒转换成时分秒