有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当通过JDBC使用数据库时,如何处理夏令时?

我的MySQL服务器配置为使用UTC(My.cnf中的默认时区=“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-1009:00:00

我在中欧,所以我的“标准”时区是“UTC+1”。JDBC似乎自动将“日期”从“UTC+1”调整为“UTC”

但是,我知道现在是夏令时,所以实际时区实际上是“UTC+2”。不幸的是,JDBC没有考虑到这一点

问题是:

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

(我尝试了TimeZone.setRawOffset(…)但这没有帮助。我知道我可以在将“theDate”字段发送到JDBC之前手动移动它,但我想这肯定不是最佳实践)

谢谢大家!


共 (1) 个答案

  1. # 1 楼答案

    实际上,将应用的时区将始终取决于您的日期引用到的当前使用的夏令时,而不是当前的日光节约,通过一个示例,它总是更容易实现:

    假设我在数据库中创建了一个文档,其列创建日期包含值01/01/2019-12:00:00 UTC

    • 当我查询2019年2月2日的文档时(此时为使用时间 巴黎的区域偏移量为UTC+1),则返回的文档将具有 以下值为“2019年1月1日-13:00:00巴黎”
    • 当我询问 同一文档01/08/2019(此时为所用时区 巴黎的偏移量为UTC+2),然后也将返回2019年1月1日-13:00:00 巴黎

    因此,应用的时区偏移取决于您的时区,以及在日期对象引用的时刻应用的夏令时