春季/休眠日期是提前一天

时间:2020-06-15 08:11:55

标签: java spring hibernate date

if request.auth.uid == resource.data.userID;        

我在这里使用 @Entity @Table(name="friend") public class Friend { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name="name") private String name; @Column(name="birthday") private Date birthday; public Date getBirthday() { System.out.println("getter" + this.birthday); return this.birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } 在我的MySQL数据库中插入一个生日。对于setter,我使用表单标签和模型属性从jsp页面中以java.sql.Date的形式获取日期作为字符串。设置后,我检查了我的数据库表,日期与预期的一样,但是当我调用getter时,日期是提前一天(例如,如果我的数据库中有2000-06-20,则getter返回2000-06-19 )。

2 个答案:

答案 0 :(得分:2)

数据类型错误

请勿使用java.util.Datejava.sql.Date类。这些类经过了精心设计,并在几年前被JSR 310中定义的现代 java.time 类所取代。

顺便说一句,永远不要编写隐式依赖某个默认时区的代码。作为程序员,这使您可以控制结果。

LocalDate

要仅表示日期,没有日期,没有时区或UTC偏移量,请使用LocalDate

LocalDate localDate = LocalDate.parse( "2000-06-20" ) ;  // Parses standard ISO 8601 format by default.

与数据库交换LocalDate对象

将仅日期值存储在类似于SQL标准类型DATE的类型的数据库列中。请注意,各种数据库的日期时间处理和命名差异很大,因此请仔细研究文档。专门在MySQL 8中,使用its DATE type

写入数据库。

myPreparedStatement.setObject( … , localDate );

从数据库检索。

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

如果您采用这种方法,则默认时区将是无关紧要的。您的结果将是一致的。

Hibernate和JPA支持 java.time

关于Hibernate的使用,HibernateJPA都在几年前进行了更新,以支持 java.time 。确保您的JDBC driver符合JDBC 4.2或更高版本。

搜索:Hibernate & java.timeJPA & java.time


Table of date-time types in Java (both legacy and modern) and in standard SQL


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规范为JSR 310

Joda-Time项目(现在位于maintenance mode中)建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。 Hibernate 5和JPA 2.2支持 java.time

在哪里获取java.time类?

答案 1 :(得分:1)

我的jdbc网址末尾有serverTimezone=UTC,删除它似乎已经解决了问题。我的数据库服务器和Tomcat服务器似乎正在使用本地时区。

相关问题