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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过JDBC处理数据库时如何处理夏令时?相关的知识,希望对你有一定的参考价值。

我的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之前对其进行手动移位,但是我想这绝对不是最佳实践)

谢谢!

答案

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

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

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

以上是关于通过JDBC处理数据库时如何处理夏令时?的主要内容,如果未能解决你的问题,请参考以下文章

使用选项卡活动和片段时如何处理后按

自然模板(例如Thymeleaf)时如何处理代码重复?

当 RabbitMQ 交换不存在时如何处理错误(并且消息通过消息传递网关接口发送)

通过 WebRTC 将视频对等点录制到服务器时如何处理数据包丢失

在 log4j2 jdbcapender 中设置日期时如何处理 null?

Excel 通过 Outlook 发送电子邮件时如何处理错误?