为了账号安全,请及时绑定邮箱和手机立即绑定

Java.sql.date 存储以前的日期而不是给定日期

Java.sql.date 存储以前的日期而不是给定日期

三国纷争 2023-04-13 17:22:04
我正在尝试将 2019-07-27 存储在 sql DB 中,但它存储了 2019-07-26。谁能帮我解决这个问题。我在这里使用 Java.sql.Date。我还尝试使用 Java.util.Date 和 Java.sql.Timestamp,结果都相同。
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

时区和错误的类别

您未能提供足够的信息以获得明确的答案。

但我怀疑你的问题是由于时区造成的。这个java.sql.Date类是一个可怕的 hack,假装代表一个日期但实际上也隐藏了一天中的时间和时区。永远不要使用这个类。

您正在使用多年前随着 JSR 310 的采用而被取代的可怕的日期时间类。仅使用java.time包中的类。

如果您只想存储日期,请使用数据类型类似于SQL 标准类型的DATE列。

LocalDate在 Java 中,与 JDBC 4.2 或更高版本一起使用。这个类只有一个日期,没有时间和时区。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

写入数据库:

LocalDate ld = LocalDate.of( 2019 , 1 , 23 ) ;
…
myPreparedStatement.setObject( … , ld ) ;

要捕获当前日期,请指定您想要/预期的时区。对于任何给定时刻,全球各地的日期因时区而异。

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;LocalDate ld = LocalDate.now( z ) ;


查看完整回答
反对 回复 2023-04-13
?
慕慕森

TA贡献1856条经验 获得超17个赞

查看 JVM 和数据库的时区。并查看有关用于创建 java.sql.Date 对象的方法的文档。

构造函数的 JavaDocjava.sql.Date(long date)状态(强调我的):

使用给定的毫秒时间值构造 Date 对象。如果给定的毫秒值包含时间信息,则驱动程序会将时间组件设置为默认时区(运行应用程序的 Java 虚拟机的时区)中对应于零 GMT 的时间

换句话说,如果您将时间设置为您所在时区的午夜,构造函数会将其设置为同一日期的格林威治标准时间午夜。但格林威治标准时间午夜可能是您所在时区的另一天。

这是我在没有看到任何代码和有关所用数据库的任何信息的情况下可以给出的最佳答案......


查看完整回答
反对 回复 2023-04-13
?
12345678_0001

TA贡献1802条经验 获得超5个赞

有两个机会:

  1. 如果您的数据库和应用程序服务器处于不同时区,请尝试根据时差调整一天中的时间。

  2. 这发生在 LEAP 年。在这种情况下,将日期和时间保存为 12:00 而不是 0:00。

long hours = 12L * 60L * 60L * 1000L;
Date d = new Date(d1.getTime() + hours);


查看完整回答
反对 回复 2023-04-13
  • 3 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信