java dateformat 时区_Java SimpleDateFormat时间解析时区问题

spark JOB在hive入库的时候发生了很诡异的现象,根据report_time时间转换为小时分区的时候,时间对不上,而且只是部分时间对不上,相差12个小时。

10855d2e2eb314da50f693baff846b14.png

由于其他集群未出现此问题,想通过代码发现是否逻辑存在问题。看了代码之后发现逻辑也十分简单:

588ff7e6ce826b583665a2e129047051.png

获取了report_time之后直接通过一个时间转换函数,获取了时间。继续查看事件转化函数:

28c02dd2ab222e090fd749f438afed08.png

这里用到了java 中SimpleDateFormat 对给定的时间进行了转换,这种转换java中比较常见,应该也是没问题的。

怀疑跟集群的时间配置有关,查看集群的两台机器的时间配置:

主机节点时间配置:(NTP时间同步未打开)

1fa93bcff244e5cfa1089ad022804af7.png

另一个节点的时间配置信息就很不一致了,发现配置的是纽约时区:

3a295f52142d75b49169f183e0ffdb3a.png

怀疑是正常的代码,在不正常的时间配置中执行出现了问题,写了一个测试代码:

7e86d458cd00af1951828d7dd7523efd.png

时区正常的机器上运行,结果正常:

adcc9a4b68d6b0d948dd450774925bbe.png

另一时区设置不正常的节点运行,问题重现了:

8f6f044432fe297a4ee7545f73cf6345.png

到此,应该是确定了SimpleDateFormat跟系统时区有关了。

查询了相关资料,可以通过对SimpleDateFormat对象调用setTimeZone(TimeZone.getTimeZone("CST")方法指定时区,解决相关问题。但是更重要的是保证集群节点时间的一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值