通过JDBC处理数据库时如何处理夏令时?

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

我的MySQL服务器已配置为使用UTC(my.cnf中的default-time-zone =“ 00:00”,并且我在数据源URL中添加了“ serverTimezone = UTC”。

据我了解,这意味着两件事:

  1. MySQL服务器在UTC区域中存储任何日期/时间数据;
  2. 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没有考虑到这一点。

问题是:

  1. 我以上的理解是否正确?
  2. 如何使JDBC考虑DST?

((我尝试过TimeZone.setRawOffset(...),但无济于事。我知道我可以在将“ theDate”字段发送到JDBC之前对其进行手动移位,但是我想这绝对不是最佳实践)

谢谢!

java mysql datetime jdbc timezone
1个回答
0
投票

实际上,将应用的时区始终取决于您的日期所指的那一刻所使用的夏时制,而不取决于当前的夏时制,使用示例总是比较容易的:

假设我在数据库中创建了一个列,创建日期包含值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巴黎。

因此,所应用的时区偏移量取决于您的时区和日期对象所引用的时刻所应用的夏令时。

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