java - 日光节约的 JDBC Mysql 时区问题
问题描述
我在使用夏令时的日期字段的 MySql Select 语句时遇到问题。
原因:java.sql.SQLException:HOUR_OF_DAY:2 -> 3
唯一可行的解决方案是serverTimezone=GMT-6
在 MySql 连接字符串中设置。但是当夏令时不存在时,我需要改变这一点。
如果我试图设置,serverTimezone=America/Denver
那么它会给出同样的错误。
原因:java.sql.SQLException:HOUR_OF_DAY:2 -> 3
我的数据库时区是America/Denver
我的项目是带有 Java 8 和 Mybatis 的 Jersey 项目。
我尝试了多种建议的解决方案,但没有任何具体的工作。请指导我。
解决方案
您应该TIMESTAMP
在 MySQL 版本 8 中的类型列中跟踪数据库中的时刻。这种类型类似于 SQL 标准类型TIMESTAMP WITH TIME ZONE
。
使用 JDBC 4.2 或更高版本,与您的数据库交换java.time对象。
ZoneId z = ZoneId.of( "America/Denver" ) ;
LocalDate ld = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 2 , 0 ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
该类ZonedDateTime
会自动针对夏令时 (DST) 等异常情况进行调整。如果在某个日期的某个日期不存在凌晨 2 点,并且具有“提前春季”DST 转换,则将时间调整为凌晨 3 点。
奇怪的是,JDBC 4.2 需要支持OffsetDateTime
但不支持更常用的Instant
和ZonedDateTime
. 所以转换。
myPreparedStatement.setObject( … , zdt.toOffsetDateTime() ) ;
恢复。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZonedDateTime zdt = odt.withZoneSameInstant( z ) ;
请注意,使用这种方法意味着我们不关心服务器或客户端上的当前默认时区,也不关心会话中当前的默认时区。
推荐阅读
- typescript - 填充角度材料自动完成中的值不起作用
- numpy - 是否有像 np.fill() 这样的 numpy 函数,但对于数组作为填充值?
- pointers - 定义结构时何时使用指针
- javascript - 使用来自另一个对象的过滤器创建新对象
- sed - 在 MAC (zsh) 上使用 SED 在标记字符串之后获取第一个 jpg
- cocoscreator - 如何在 Cocos Creator 中将一个向量移向另一个向量?
- assembly - 为什么我们不能将 64 位立即数移动到内存中?
- c# - UTF-8 URL 编码
- c# - 从 .Net 框架应用程序中的 .Net Core 库调用方法
- python - Python Simpy:并行使用两个资源