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 处得到了重复的日期,并且从那里到结束的日期是错误的。
正确的解决方案取决于您是真的只需要存储日期,还是需要存储时间点。
- 对于没有时间的日期,在 MySQL 中使用
date
,在 Java 中使用 LocalDate
。
- 对于时间点,MySQL 中的
timestamp
和 Java 中的 OffsetDateTime
。 MySQL 以 UTC 格式存储 timestamp
个值,因此它们定义了一个时间点。
- 如果您无法更改 MySQL 中的数据类型,
datetime
在 Java 中使用的正确类型是 LocalDateTime
。
LocalDate
、OffsetDateTime
和 LocalDateTime
都是 java.time 的一部分,现代 Java 日期和时间 API.
要从结果集中检索 java.time 的类型,请使用其 getOnbject
方法,而不是 getDate
。例如得到一个 LocalDate
:
rs.getObject("testedDate", LocalDate.class)
除了你传递 OffsetDateTime.class
或 LocalDateTime.class
作为第二个参数外,其他类型是相同的。
在任何情况下都不要使用 java.sql.Date
和 rs.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.
知道这种行为的原因吗?
来自测试 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 处得到了重复的日期,并且从那里到结束的日期是错误的。
正确的解决方案取决于您是真的只需要存储日期,还是需要存储时间点。
- 对于没有时间的日期,在 MySQL 中使用
date
,在 Java 中使用LocalDate
。 - 对于时间点,MySQL 中的
timestamp
和 Java 中的OffsetDateTime
。 MySQL 以 UTC 格式存储timestamp
个值,因此它们定义了一个时间点。 - 如果您无法更改 MySQL 中的数据类型,
datetime
在 Java 中使用的正确类型是LocalDateTime
。
LocalDate
、OffsetDateTime
和 LocalDateTime
都是 java.time 的一部分,现代 Java 日期和时间 API.
要从结果集中检索 java.time 的类型,请使用其 getOnbject
方法,而不是 getDate
。例如得到一个 LocalDate
:
rs.getObject("testedDate", LocalDate.class)
除了你传递 OffsetDateTime.class
或 LocalDateTime.class
作为第二个参数外,其他类型是相同的。
在任何情况下都不要使用 java.sql.Date
和 rs.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.