当前位置: 代码网 > it编程>编程语言>Java > Java SimpleDateFormat时区不同导致时间不一致怎么办?

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

2026年08月04日 Java 我要评论
在做分布式系统开发的过程中,笔者遇到了集群中各成员显示时间数据不一致的问题,排查发现是因各个成员的系统时区设置不同,导致simpledateformat类解析结果不同导致,mark一下java中的si

在做分布式系统开发的过程中,笔者遇到了集群中各成员显示时间数据不一致的问题,排查发现是因各个成员的系统时区设置不同,导致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,如下图:

调整计算机的系统时区

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

以上实验表明

对于同一个表示当前时间毫秒数的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

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

如果显式地指定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));
    }
}

程序输出结果如下:

 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com