我的 MySQL 服务器配置为使用 UTC(my.cnf 中的 default-time-zone = "00:00"),并且我在数据源 URL 中添加了“serverTimezone=UTC”。
据我了解,这意味着两件事:
- MySQL 服务器将所有日期/时间数据存储在 UTC 区域中;
- JDBC 知道这一点。
假设我有一些带有 LocalDateTime 字段的 Dao 类:
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-10 09:00:00”。
我在中欧,所以我的“标准”时区是“UTC+1”。看来 JDBC 自动将“theDate”从“UTC+1”调整为“UTC”。
但是,我知道现在是夏令时,所以实际时区实际上是“UTC+2”。不幸的是,JDBC 没有考虑到这一点。
问题是:
- 我的上述理解是否正确?
- 如何让 JDBC 考虑 DST?
(我尝试了 TimeZone.setRawOffset(...) 但它没有帮助。我知道我可以在将“theDate”字段发送到 JDBC 之前手动移动它,但我想这绝对不是最好的练习)
谢谢!
最佳答案
实际上,将应用的时区始终取决于您的日期所引用的那一刻使用的夏令时,而不是当前的夏令时,通过示例总是更容易:
假设我在数据库中创建了一个文档,其列创建日期包含值 01/01/2019-12:00:00 UTC
。
- 当我在 02/02/2019 查询文档时(此时使用的时间 巴黎的时区偏移量为 UTC+1),则返回的文档将具有 以下值“01/01/2019-13:00:00 巴黎”。
- 当我查询
同一个文档
01/08/2019
(此时使用的时区 巴黎的偏移量是 UTC+2),那么也将返回 01/01/2019-13:00:00 巴黎。
因此,应用的时区偏移量取决于您的时区以及日期对象引用的时刻应用的夏令时。
关于java - 通过 JDBC 使用数据库时如何处理夏令时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58536700/