JPA,Glassfish,Mysql:UTC时间转换发生两次
我快发疯了。。。我最近注意到,当我访问JPA,Glassfish,Mysql:UTC时间转换发生两次,mysql,datetime,jakarta-ee,jpa,Mysql,Datetime,Jakarta Ee,Jpa,我快发疯了。。。我最近注意到,当我访问日期字段时,我的JPA管理实体中的时间显示错误: 我的个人时区是CEST,运行Glassfish和MySQL的机器也是如此 Glassfish被指示使用UTC作为默认时区:a@Startup-bean设置Timezone.setDefault(Timezone.getTimeZone(“UTC”) 在persistence.xml中禁用了缓存 下面是发生的情况: 实体A具有java.util.Date的字段syncTimestamp 触发特定REST资
日期
字段时,我的JPA管理实体中的时间显示错误:
- 我的个人时区是CEST,运行Glassfish和MySQL的机器也是如此
- Glassfish被指示使用UTC作为默认时区:a
-bean设置@Startup
Timezone.setDefault(Timezone.getTimeZone(“UTC”)代码>
- 在persistence.xml中禁用了缓存
- 实体A具有
的字段java.util.Date
syncTimestamp
- 触发特定REST资源时,时间戳设置为now:
。让我们假设我挂在墙上的时钟是14:30:00(为简洁起见省略了日期)a.setSyncTimestamp(new Date())
- 该实体是受管理的,因此更新将在数据库中结束。数据库中的行(类型为
)显示预期值“12:30:00h”-CEST当前比UTC早2小时DATETIME
- 在同一事务中访问getter会将时间戳输出为“12:30:00.123Z”(注意毫秒)
- 再次从数据库检索实体(禁用缓存)后,在单独的事务中访问getter,输出“10:30:00Z”
java.util.Date
和MySQLDATETIME
都不了解时区。这应该不是问题,只要一切都被认为是“UTC”,对吗?现在为什么JPA(我想?)会转换这个值
(附:我发现了一篇帖子。它建议将JVM设置为UTC时区——但这不是我的启动Bean所做的吗?)
编辑:发现缺少一点关键信息。为了准备Glassfish集群,我将EJB计时器服务的数据库移到了MySQL数据库中。结果,JDBC驱动程序被从应用程序提取到glassfish lib目录。好的,我已经发现了发生了什么,以及如何修复它 看起来是这样的,因为EJB计时器服务是在我的启动之前启动的,mysql JDBC驱动程序是用时区加载和初始化的(当时是系统默认值=CEST) 稍后将默认时区设置为UTC不会再影响JDBC驱动程序(这可能是glassfish的错误吗?) 解决方案是将JVM的默认时区设置为UTC:
asadmin create-jvm-options -Duser.timezone=UTC
asadmin restart-domain
好的,我已经知道发生了什么,以及如何修复它 看起来是这样的,因为EJB计时器服务是在我的启动之前启动的,mysql JDBC驱动程序是用时区加载和初始化的(当时是系统默认值=CEST) 稍后将默认时区设置为UTC不会再影响JDBC驱动程序(这可能是glassfish的错误吗?) 解决方案是将JVM的默认时区设置为UTC:
asadmin create-jvm-options -Duser.timezone=UTC
asadmin restart-domain