ResultSet getDate 复制日期并失败等等

ResultSet getDate duplicating a date and failing so on

知道这种行为的原因吗?

来自测试 MySQL table 有两列

使用此数据(日期从 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 处得到了重复的日期,并且从那里到结束的日期是错误的。

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

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

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

要从结果集中检索 java.time 的类型,请使用其 getOnbject 方法,而不是 getDate。例如得到一个 LocalDate:

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

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

在任何情况下都不要使用 java.sql.Daters.getDate()java.sql.Date class 是在已经设计得很糟糕的 java.util.Date class 之上的黑客攻击。幸运的是,Date classes 早就过时了(没有双关语意)。

为什么一整天都错了?

I am using CST …

虽然我不能告诉你整个故事,但变化发生在 3 月 14 日,即北美大部分地区(包括 America/Chicago 和 America/Winnipeg 时间)夏令时 (DST) 开始的同一天区域。

although I am wondering why it offsets a whole day instead of just the time switch.

打印 java.sql.Date 时只打印日期,不打印时间。我敢打赌,在那些似乎早了一天的日期中,一天中的时间是 23:00。而在其他的00:00,所以内部只相差1小时。

Link

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