Java ResultSet getDate复制日期并失败,依此类推
知道这种行为的原因吗? 来自一个包含两列的测试MySQL表 使用此数据(日期从1日到31日) 通过Java检索日期Java ResultSet getDate复制日期并失败,依此类推,java,mysql,date,resultset,Java,Mysql,Date,Resultset,知道这种行为的原因吗? 来自一个包含两列的测试MySQL表 使用此数据(日期从1日到31日) 通过Java检索日期 public static void executeQuery (Connection conn){ try { Statement stmt = conn.createStatement() ; String query = "SELECT recordId, testedDate FROM test_
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和错误的日期从那里结束
正确的解决方案取决于您是真的只需要存储日期,还是需要存储时间点
date
,在Java中使用LocalDate
timestamp
,Java中的OffsetDateTime
。MySQL以UTC格式存储timestamp
值,因此它们定义了一个时间点datetime
在Java中使用的正确类型是LocalDateTime
LocalDate
、OffsetDateTime
和LocalDateTime
都是现代java日期和时间API java.time的一部分
要从结果集中从java.time检索类型,请使用其getonobject
方法,而不是getDate
。例如,要获取LocalDate
:
rs.getObject("testedDate", LocalDate.class)
其他类型相同,只是将OffsetDateTime.class
或LocalDateTime.class
作为第二个参数传递
在任何情况下都不能使用java.sql.Date
和rs.getDate()
。java.sql.Date
类是在已经设计得很糟糕的java.util.Date
类之上的一个黑客攻击。幸运的是,两个Date
类都早已过时(没有双关语)
为什么一整天都错了?
我正在使用CST
虽然我不能告诉你全部情况,但变化发生在3月14日,也就是北美大部分地区夏季时间(DST)开始的同一天,包括美洲/芝加哥和美洲/温尼伯时区
虽然我想知道为什么它能抵消一整天而不仅仅是时间的转换
打印java.sql.Date
时,只打印日期,不打印时间。我敢打赌,在那些似乎早了一天的日子里,一天的时间在幕后是23:00。而其他的是00:00,所以内部的差异只有1小时
链接
解释如何使用java.time。正确的解决方案取决于您是真的只需要存储日期,还是需要存储时间点
date
,在Java中使用LocalDate
timestamp
,Java中的OffsetDateTime
。MySQL以UTC格式存储timestamp
值,因此它们定义了一个时间点datetime
在Java中使用的正确类型是LocalDateTime
LocalDate
、OffsetDateTime
和LocalDateTime
都是现代java日期和时间API java.time的一部分
要从结果集中从java.time检索类型,请使用其getonobject
方法,而不是getDate
。例如,要获取LocalDate
:
rs.getObject("testedDate", LocalDate.class)
其他类型相同,只是将OffsetDateTime.class
或LocalDateTime.class
作为第二个参数传递
在任何情况下都不能使用java.sql.Date
和rs.getDate()
。java.sql.Date
类是在已经设计得很糟糕的java.util.Date
类之上的一个黑客攻击。幸运的是,两个Date
类都早已过时(没有双关语)
为什么一整天都错了?
我正在使用CST
虽然我不能告诉你全部情况,但变化发生在3月14日,也就是北美大部分地区夏季时间(DST)开始的同一天,包括美洲/芝加哥和美洲/温尼伯时区
虽然我想知道为什么它能抵消一整天而不仅仅是时间的转换
打印java.sql.Date
时,只打印日期,不打印时间。我敢打赌,在那些似乎早了一天的日子里,一天的时间在幕后是23:00。而其他的是00:00,所以内部的差异只有1小时
链接
解释如何使用java.time.检查时区偏移永远不要使用
java.sql.Date
和rs.getDate()
。对于数据类型为datetime
的列,甚至更少java.sql.Date
是对已经设计糟糕的java.util.Date
类的一种攻击,幸运的是它早已过时。对于这种MySQL数据类型,请使用java.time中的LocalDateTime
,现代java日期和时间API,以及rs.getObject(“testedDate”,LocalDateTime.class)
。您的时区是在北美还是在夏季(DST)3月14日开始的其他地方?@OleV.V。LocalDateTime起了作用,我使用CST,直到4月4日时间都在变化。。。尽管我想知道为什么它会抵消一整天而不仅仅是时间开关。检查时区偏移永远不要使用java.sql.Date
和rs.getDate()
。对于数据类型为datetime
的列,甚至更少java.sql.Date
是对已经设计糟糕的java.util.Date
类的一种攻击,幸运的是它早已过时。对于这种MySQL数据类型,请使用java.time中的LocalDateTime
,现代java日期和时间API,以及rs.getObject(“testedDate”,LocalDateTime.class)
。您的时区是在北美还是在夏季(DST)3月14日开始的其他地方?@OleV.V。LocalDateTime起了作用,我使用CST,直到4月4日时间都在变化。。。虽然我想知道为什么它会抵消一整天的时间,而不仅仅是时间切换。我肯定在考虑改进这个遗留应用程序,因为它到处都在使用,非常感谢您的高质量响应。我肯定在考虑改进这个遗留应用程序