JavaSimpleDateFormat时区不同导致时间不一致如何办?

作者:袖梨 2026-08-05

在做分布式系统开发的过程中,笔者遇到了集群中各成员显示时间数据不一致的问题,排查发现是因各个成员的系统时区设置不同,导致

SimpleDateFormat

类解析结果不同导致,mark一下

Java中的SimpleDateFormat类

具有将Date对象转换成指定格式的字符串,对于同一个

Date

对象,

SimpleDateFormat

在不同的时区环境下,将解析出不同的结果。

示例程序如下:

import java.text.SimpleDateFormat;     public class Main {         public static void main(String[] args) {            long mm = 1522480737272l;            SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            System.out.println(s.format(mm));        }    }

该程序在笔者的实验环境中的输出结果为:

2018-03-31 15:18:57

,如下图:

JavaSimpleDateFormat时区不同导致时间不一致怎么办?

调整计算机的系统时区

将会得到不同的输出结果:

JavaSimpleDateFormat时区不同导致时间不一致怎么办?

JavaSimpleDateFormat时区不同导致时间不一致怎么办?

以上实验表明

对于同一个表示当前时间毫秒数的

long

值,在不显式地指定时区的情况下,

SimpleDateFormat

类在解析参数过程中会参考当前的系统时间,当改变系统时间时,解析结果也会发生变化。

笔者通过实验进一步发现,当

SimpleDateFormat

类解析传入的毫秒参数时,该类默认认为传入的毫秒值为UTC标准下的时间,再结合本机的系统时区和时间进行时差调整。

当传入值为

0

,同时系统时区为UTC标准时区的时候,输入结果为:

1970-01-01 00:00:00

,修改前文中的代码如下:
import java.text.SimpleDateFormat;public class Main {    public static void main(String[] args) {//        long mm = 1522480737272l;        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        System.out.println(s.format(0));    }}

设置本机系统时区为UTC

执行上述代码,结果如下:

JavaSimpleDateFormat时区不同导致时间不一致怎么办?

JavaSimpleDateFormat时区不同导致时间不一致怎么办?

如果显式地指定SimpleDateFormat对象的时区

则在解析参数的过程中将根据指定的时区来解析,下面的代码进一步说明了对于相同的参数,不同时区设置下解析结果是不同的。

import java.text.SimpleDateFormat;import java.util.TimeZone;public class Main {    public static void main(String[] args) {        long mm = 1522480737272l;        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        s.setTimeZone(TimeZone.getTimeZone("UTC"));        System.out.println("UTC: " + s.format(mm));        s.setTimeZone(TimeZone.getTimeZone("CNT"));        System.out.println("CNT: " + s.format(mm));        s.setTimeZone(TimeZone.getTimeZone("BET"));        System.out.println("BET: " + s.format(mm));        s.setTimeZone(TimeZone.getTimeZone("ECT"));        System.out.println("UECT: " + s.format(mm));    }}

程序输出结果如下:

JavaSimpleDateFormat时区不同导致时间不一致怎么办?

总结

相关文章

精彩推荐