java当通过JDBC使用数据库时,如何处理夏令时?
我的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");
// 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没有考虑到这一点强>
问题是:
- 我以上的理解正确吗李>
- 如何使JDBC考虑DST李>
(我尝试了TimeZone.setRawOffset(…)但这没有帮助。我知道我可以在将“theDate”字段发送到JDBC之前手动移动它,但我想这肯定不是最佳实践)
谢谢大家!
# 1 楼答案
实际上,将应用的时区将始终取决于您的日期引用到的当前使用的夏令时,而不是当前的日光节约,通过一个示例,它总是更容易实现:
假设我在数据库中创建了一个文档,其列创建日期包含值
01/01/2019-12:00:00 UTC
01/08/2019
(此时为所用时区 巴黎的偏移量为UTC+2),然后也将返回2019年1月1日-13:00:00 巴黎李>因此,应用的时区偏移取决于您的时区,以及在日期对象引用的时刻应用的夏令时