白天不懂夜的黑--java中时区的问题

本文记录了一次因时区差异导致的数据库时间戳问题排查过程。问题最初表现为代码在不同地区部署时出现异常,通过逐步排查定位到了时区相关的代码逻辑,并最终通过修改数据库字段类型及使用特定的时间戳类解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天早上,项目站会,在澳大利亚的客户说,我们应该在提交代码之前在本地跑测试。

我心里觉得委屈啊,我提交代码的时候的确都是跑了测试的啊。

多争无益,于是,我又去看看代码到底是不是有什么问题。


在我的DA(Desktop Anywhere)中,我使用和CI上相同的命令又跑了一次,还是OK的。

在这里被卡住了一下,于是找澳大利亚的客户帮忙看看是不是CI上的配置发生了变化。

客户说CI是OK的,他把代码update到他的DA上跑,也是挂的。

我又找另外一个在成都的同事,用他的DA跑一次,也是OK的。

奇怪。。。

NND,难道是RP有被虐了。




后来想到代码中有一段逻辑是和时间相关的,难道是因为成都和澳大利亚的时差造成的?

试试看,把DA的时区改成了澳大利亚时区(UTC+10)。

嘿嘿,还真的出现问题了。


我们使用的数据库是18摸的数据库,在创建一个新的record的时候,使用的是“CURRENT TIMESTAMP”

这个时候,“CURRENT TIMESTAMP”是不包含时区信息的。

于是,查阅了文档以后,我们把SQL改成了“CURRENT TIMESTAMP WITH TIME ZONE”。(CURRENT TIMESTAMP文档)

满心欢喜的认为应该可以解决这个问题了。


但是,又挂了。

日本人。


终于,也就是finally,我们找到了这个文档(CURRENT TIMESTAMP WITH TIME ZONE之于Java

原来在创建表的时候,column的数据类型应该设置成CURRENT TIMESTAMP WITH TIME ZONE。

而且,在读取,更新这个column的时候,应该使用的是com.ibm.db2.jcc.DBTimestamp。


人艰不拆啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值