【问题标题】:ResultSet getDate duplicating a date and failing so onResultSet getDate 复制日期并失败等等
【发布时间】:2021-06-22 15:11:37
【问题描述】:

知道这种行为的原因吗?

来自具有两列的测试 MySQL 表

使用此数据(日期从 1 到 31)

通过 Java 检索日期

public static void executeQuery (Connection conn){
        try {
            Statement stmt = conn.createStatement() ;
            String query = "SELECT recordId, testedDate FROM test_date;";
            ResultSet rs = stmt.executeQuery(query) ;
            if(rs != null) {
                while(rs.next())
                    System.out.println(rs.getInt("recordId") + " - [" + rs.getDate("testedDate") + "]");
            }else {
                System.out.println("No results found!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我在记录 15 处得到重复的日期,并且从那里到结束的日期错误。

【问题讨论】:

  • 检查时区偏移
  • 永远不要使用java.sql.Daters.getDate()。对于数据类型为datetime 的列,甚至更少。 java.sql.Date 是在设计已经很糟糕的 java.util.Date 类之上的一个hack,幸运的是已经过时了。对于这种 MySQL 数据类型,请使用来自 java.time、现代 Java 日期和时间 API 的 LocalDateTimers.getObject("testedDate", LocalDateTime.class)
  • 您的时区是在北美还是其他地方,夏令时 (DST) 于 3 月 14 日开始?
  • @OleV.V. LocalDateTime 成功了,我使用 CST 和时间变化,直到 4 月 4 日......虽然我想知道为什么它会抵消一整天而不是时间开关。

标签: java mysql date resultset


【解决方案1】:

正确的解决方案取决于您是真的只需要存储日期,还是需要存储时间点。

  1. 对于没有时间的日期,在 MySQL 中使用 date,在 Java 中使用 LocalDate
  2. 对于时间点,更喜欢 MySQL 中的 timestamp 和 Java 中的 OffsetDateTime。 MySQL 以 UTC 格式存储 timestamp 值,因此它们定义了一个时间点。
  3. 如果您无法更改 MySQL 中的数据类型,datetime 在 Java 中使用的正确类型是 LocalDateTime

LocalDateOffsetDateTimeLocalDateTime 都是现代 Java 日期和时间 API java.time 的一部分。

要从结果集中从 java.time 检索类型,请使用其 getOnbject 方法,而不是 getDate。例如获取LocalDate

       rs.getObject("testedDate", LocalDate.class)

除了将OffsetDateTime.classLocalDateTime.class 作为第二个参数传递之外,其他类型相同。

在任何情况下都不要使用java.sql.Daters.getDate()java.sql.Date 类是对已经设计不佳的java.util.Date 类的一种改进。幸运的是,这两个 Date 课程早已过时(没有双关语)。

为什么一整天都错了?

我正在使用 CST……

虽然我不能告诉你整个故事,但变化发生在 3 月 14 日,也就是北美大部分地区(包括美国/芝加哥和美国/温尼伯时区)夏令时 (DST) 开始的同一天。

虽然我想知道为什么它会抵消一整天而不仅仅是时间开关。

打印java.sql.Date 时,仅打印日期,而不打印时间。我敢打赌,在那些看起来为时过早的日期里,一天中的时间是 23:00。而其他的都是00:00,所以内部相差只有1小时。

链接

Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

  • 我确实正在考虑改进这个旧版应用程序,因为它无处不在,非常感谢您的高质量回复。
猜你喜欢
  • 2016-06-08
  • 2011-03-17
  • 2019-12-03
  • 2020-09-01
  • 1970-01-01
  • 2011-06-16
  • 2017-11-29
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多