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 )。
答案 0 :(得分:2)
请勿使用java.util.Date
或java.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的使用,Hibernate和JPA都在几年前进行了更新,以支持 java.time 。确保您的JDBC driver符合JDBC 4.2或更高版本。
搜索:Hibernate & java.time和JPA & java.time
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅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服务器似乎正在使用本地时区。