我的MySQL服务器已配置为使用UTC(my.cnf中的default-time-zone =“ 00:00”,并且我在数据源URL中添加了“ serverTimezone = UTC”。
据我了解,这意味着两件事:
假设我有一些带有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没有考虑到这一点。
问题是:
((我尝试过TimeZone.setRawOffset(...),但无济于事。我知道我可以在将“ theDate”字段发送到JDBC之前对其进行手动移位,但是我想这绝对不是最佳实践)
谢谢!
实际上,将应用的时区始终取决于您的日期所指的那一刻所使用的夏时制,而不取决于当前的夏时制,使用示例总是比较容易的:
假设我在数据库中创建了一个列,创建日期包含值01/01/2019-12:00:00 UTC
。
01/08/2019
(此时使用的时区巴黎的偏移量是UTC + 2),则始终返回01/01 / 2019-13:00:00巴黎。因此,所应用的时区偏移量取决于您的时区和日期对象所引用的时刻所应用的夏令时。