3 回答
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 ) ;
TA贡献1856条经验 获得超17个赞
查看 JVM 和数据库的时区。并查看有关用于创建 java.sql.Date 对象的方法的文档。
构造函数的 JavaDocjava.sql.Date(long date)
状态(强调我的):
使用给定的毫秒时间值构造 Date 对象。如果给定的毫秒值包含时间信息,则驱动程序会将时间组件设置为默认时区(运行应用程序的 Java 虚拟机的时区)中对应于零 GMT 的时间。
换句话说,如果您将时间设置为您所在时区的午夜,构造函数会将其设置为同一日期的格林威治标准时间午夜。但格林威治标准时间午夜可能是您所在时区的另一天。
这是我在没有看到任何代码和有关所用数据库的任何信息的情况下可以给出的最佳答案......
TA贡献1802条经验 获得超5个赞
有两个机会:
如果您的数据库和应用程序服务器处于不同时区,请尝试根据时差调整一天中的时间。
这发生在 LEAP 年。在这种情况下,将日期和时间保存为 12:00 而不是 0:00。
long hours = 12L * 60L * 60L * 1000L; Date d = new Date(d1.getTime() + hours);
添加回答
举报