Java 通过JDBC使用数据库时,如何处理夏令时?
我的MySQL服务器配置为使用UTC(My.cnf中的默认时区=“00:00”),我在数据源URL中添加了“serverTimezone=UTC” 据我所知,这意味着两件事:Java 通过JDBC使用数据库时,如何处理夏令时?,java,mysql,datetime,jdbc,timezone,Java,Mysql,Datetime,Jdbc,Timezone,我的MySQL服务器配置为使用UTC(My.cnf中的默认时区=“00:00”),我在数据源URL中添加了“serverTimezone=UTC” 据我所知,这意味着两件事: MySQL服务器在UTC区域中存储任何日期/时间数据 JDBC知道这一点 假设我有一个带有LocalDateTime字段的Dao类: class MyDataDao { public LocalDateTime theDate = LocalDateTime.parse("2020-01-10T10:00:00")
class MyDataDao {
public LocalDateTime theDate = LocalDateTime.parse("2020-01-10T10:00:00");
// some other fields ...
}
然后我想将MyDataDao插入数据库:
m_jdbc.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(SQL_ADDMYDATA, Statement.RETURN_GENERATED_KEYS);
//... some other fields ...
// the date time field
ps.setObject(3, myData.getTheDate());
return ps;
}
}, genKey);
现在问题来了:
我在CLI中查询了数据库,它是“2020-01-1009:00:00”
我在中欧,所以我的“标准”时区是“UTC+1”。JDBC似乎自动将“日期”从“UTC+1”调整为“UTC”
但是,我知道现在是夏令时,所以实际时区实际上是“UTC+2”。不幸的是,JDBC没有考虑到这一点。
问题是:
谢谢大家! 实际上,将应用的时区将始终取决于您的日期引用到的当前使用的夏时制,而不取决于当前的日光节约,举个例子总是比较容易: 假设我在数据库中创建了一个文档,其列创建日期包含值
01/01/2019-12:00:00 UTC
- 当我查询2019年2月2日的文档时(此时为使用时间 巴黎的区域偏移量为UTC+1),则返回的文档将具有 以下值为“2019年1月1日-13:00:00巴黎”李>
- 当我询问 与2019年8月1日<代码>相同的文件(此时为所用时区 巴黎的偏移量为UTC+2),然后也将返回2019年1月1日-13:00:00 巴黎
因此,应用的时区偏移量取决于您的时区和您的日期对象引用的时刻应用的夏令时。您的时区是什么?对于CET,1月10日是UTC+1,而不是UTC+2,但是它应用时区转换是很奇怪的:在一个时间段上,这不应该发生在
LocalDateTime
上(非时区)TIMESTAMP
column.@markrotVeel如果我理解正确,MySQL在这里是特别的(与其他RDBMS相比):时间戳总是“有时区”。如果你想要它没有时区(很少推荐),您需要使用datetime
数据类型。实际上,在谈论时区时,更应该谈论时区ID,如欧洲/巴黎、非洲/恩贾梅纳、太平洋/斐济…
,而不是时区偏移,如“UTC+2,UTC+1…”@OleV.V.hi,感谢您的回复。不幸的是,该列类型是datetime,到期日o时间戳的范围限制。问题是,我认为转换不是由MySQL服务器完成的,而是由客户端完成的,比如JDBC。现在的症状是转换是自动执行的,如果不在DST中就正确了……噢,这次我真的明白了你的意思。你的意思是自动时间转换不是基础d在执行查询时,但基于要查询的实际时间值!因此,我的测试值为“2020-01-10”,无论在夏季还是冬季测试,都不会触发DST转换。这对我来说是一个很大的惊喜。(顺便说一句,我是数据库的初学者)今晚我将用一个不同的测试值来代表一个夏天再次测试它。非常感谢!它帮助了我很多!