在我的db表中有一列 c_dob
类型 date
对于控制器请求类,我使用上面的字段,如下所示:
import java.sql.Timestamp;
public class UpdateUserProfileRequest {
private Timestamp dob;
public Timestamp getDob() {
return dob;
}
public void setDob(Timestamp dob) {
this.dob = dob;
}
}
问题:
当我有了价值 1979-06-30
作为请求json值传递,在控制器类中,请求类将该值记录为 1979-06-30 02:00:00.0
(小时部分自行添加并给出一个值)
其次,我使用以下代码设置dob:
Map<String, Object> outMap = proc.execute(inParams);
profile.setDob((Date) outMap.get("out_dob") != null
? new Timestamp(((Date) outMap.get("out_dob")).getTime()) : null);
这里发生的是 1979-06-30 02:00:00.0
已更改为 1979-06-30 01:00:00.0
导致逻辑问题。
那么,这种行为有什么原因或解决办法吗?
编辑:数据库是mysql
2条答案
按热度按时间gywdnpxw1#
您使用了错误的数据类型。mysql类型
DATE
表示仅限日期的值,不含一天中的时间和时区。相比之下java.sql.Timestamp
类表示一个时刻、时间线上的一个特定点、以utc表示的一天中某个时间的日期。方钉,圆孔。只使用java.time类。永远不要使用可怕的遗留日期时间类,例如
Timestamp
.对于mysql
DATE
使用java.time.LocalDate
使用符合jdbc 4.2或更高版本的jdbc驱动程序。vbkedwbf2#
利用
java.time.LocalDateTime
这是时区意识和应该帮助你很多。。。timestamp是黑暗时代遗留下来的可怕的东西:)