【问题标题】:Java.sql.date storing previous date instead of given dateJava.sql.date 存储以前的日期而不是给定的日期
【发布时间】:2019-12-02 14:00:24
【问题描述】:

我正在尝试将 2019-07-27 存储在 sql DB 中,但它存储 2019-07-26。任何人都可以在这方面帮助我。 我在这里使用 Java.sql.Date。我还尝试了 Java.util.Date 和 Java.sql.Timestamp,都给出了相同的结果。

【问题讨论】:

  • 请出示您的代码 - 否则无法说明问题所在。
  • 请与我们分享您的代码。没有它,我们无能为力。
  • 究竟该列是什么数据类型?什么数据库?
  • 我建议您既不要使用java.sql.Datejava.util.Date,也不要使用java.sql.Timestamp。这些课程设计不佳且早已过时。使用来自java.time, the modern Java date and time APILocalDate

标签: java sql date jdbc time


【解决方案1】:

时区和错误的班级

您未能提供足够的信息来确定答案。

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

您正在使用糟糕的日期时间类,这些类在几年前随着 JSR 310 的采用而被取代。仅使用 java.time 包中的类。

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

在 Java 中,将 LocalDate 与 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 ) ;

【讨论】:

    【解决方案2】:

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

    构造函数 java.sql.Date(long date) 的 JavaDoc,例如状态(强调我的):

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

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

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

    如果我的回答有帮助,请为下一个找到您的问题的人添加有关解决方案的更多信息,或者如果我的回答没有引导您找到解决方案,请给我们一些代码。

    Question 14693148: JPA TemporalType.Date giving wrong date 上的答案更详细一些,建议在任何地方都使用 GMT/UTC。

    Question 21174634: JDBC ResultSet: I need a getDateTime, but there is only getDate and getTimeStamp 上的第二个答案建议在通过 JDBC 读取时使用较新的日期/时间类。这也可能适用于写作。

    【讨论】:

      【解决方案3】:

      有两个机会:

      1. 如果您的 DB 和 APP 服务器位于不同的时区,请尝试根据时差调整一天中的时间。
      2. 这发生在 LEAP 年。在这种情况下,将日期和时间保存为 12:00 而不是 0:00。
      long hours = 12L * 60L * 60L * 1000L;
      Date d = new Date(d1.getTime() + hours);
      

      【讨论】:

      • 2019 年不是闰年。
      • 可能他的DB服务器和App服务器在不同的时区
      猜你喜欢
      • 2019-12-03
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 2016-08-05
      相关资源
      最近更新 更多