Java:SimpleDateFormat解析过程中的时区问题
程序员文章站
2022-05-24 15:28:19
...
(在做分布式系统开发的过程中,笔者遇到了集群中各成员显示时间数据不一致的问题,排查发现是因各个成员的系统时区设置不同,导致SimpleDateFormat类解析结果不同导致,mark一下)
Java中的SimpleDateFormat类具有将Date对象转换成指定格式的字符串,对于同一个Date对象,SimpleDateFormat在不同的时区环境下,将解析出不同的结果。
示例程序如下:
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,修改前文中的代码如下:
调整计算机的系统时区,将会得到不同的输出结果:
以上实验表明,对于同一个表示当前时间毫秒数的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)); } }
程序输出结果如下:
上一篇: Web开发中的时区问题
下一篇: Springboot入门-001
推荐阅读
-
基于java时区转换夏令时的问题及解决方法
-
java Swing JTable 解析单元格录入数据后不能保存的问题 博客分类: swing JTable javaswingJTable单元格保存数据
-
java编程中的缺省时区问题 博客分类: awsJava编程 DateCalendarTimeZonedockeraws
-
SimpleDateFormat的非线程安全问题 博客分类: java 基础
-
java web请求和响应中出现中文乱码问题的解析
-
java web请求和响应中出现中文乱码问题的解析
-
解析Java的JNI编程中的对象引用与内存泄漏问题
-
解析Java的JNI编程中的对象引用与内存泄漏问题
-
浅谈java里的EL表达式在JSP中不能解析的问题
-
浅谈java里的EL表达式在JSP中不能解析的问题