我有一个(java)appserver使用timezone America / Los_Angeles,但是使用UTC的数据库。我希望数据库中的日期能够反映appserver的时区(这是开发团队所在的时区,因此在他们的时区中拥有所有日期和时间会很有帮助)。我使用Hibernate将java.util.Date字段映射到MySQL TIMESTAMP和DATETIME字段。我有create_date字段(由app设置)和update_date字段,带有以下定义:
`update_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
当我从应用程序进行插入时,它运行正常:如果它在美国/洛杉矶的下午9点,数据库显示21:00(即使连接的时区是UTC,这很奇怪但是希望的)。当我检索项目时,create_date仍然是21:00。目前很好。但是当我进行更新时,CURRENT_TIMESTAMP会启动并在第二天显示04:00。当应用程序检索项目时,它仍然显示04:00。
我尝试了很多useTimezone = true,serverTimezone = America / Los_Angeles,useGMTMillisForDatetimes = true和useLegacyDatetimeCode = false的组合。我也试过了
`update_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 'CONVERT_TZ(CURRENT_TIMESTAMP,''+00:00'',''-07:00'')'
但是数据库讨厌这个,我无法让它发挥作用。我可以删除ON UPDATE触发器,但如果有人直接更新数据库,我将失去审核。
奇怪的是,即使我设置serverTimezone = UTC,当我从应用程序插入时,create_date仍然显示为21:00,而不是UTC。不知何故,似乎在appserver端进行了时区转换。我在create_date上的JPA映射注释是
@Column(name='create_date', updatable=false)
@Temporal(TemporalType.TIMESTAMP)
Date createDate
有没有办法让它正常工作?
我正在使用ConnectorJ 5.1.29和MySQL服务器5.6.13。