带夏令时的JDBC Mysql时区问题

问题描述 投票:0回答:1

我在使用日光节约的日期字段中遇到MySql Select语句的问题。

原因:java.sql.SQLException:HOUR_OF_DAY:2-> 3

唯一有效的解决方案是在MySql Connection String中设置serverTimezone=GMT-6。但是,当不存在夏令时时,我将需要更改此设置。

如果我尝试设置serverTimezone=America/Denver,则会给出相同的错误。

原因:java.sql.SQLException:HOUR_OF_DAY:2-> 3

我的数据库时区是美国/丹佛

我的项目是带有Java 8和Mybatis的Jersey项目。

我尝试了多种建议的解决方案,但没有任何具体的方法。请指导我。

java mysql timezone jersey mybatis
1个回答
1
投票

您应该在MySQL版本8中以TIMESTAMP类型的列跟踪数据库中的时刻。该类型类似于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,但不需要更常用的InstantZonedDateTime。因此转换。

myPreparedStatement.setObject( … , zdt.toOffsetDateTime() ) ;

检索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZonedDateTime zdt = odt.withZoneSameInstant( z ) ;

[注意,使用此方法意味着我们不在乎服务器或客户端上的当前默认时区,也不在乎您会话中的当前默认时区。

© www.soinside.com 2019 - 2024. All rights reserved.