sql日期类型的java时间戳有问题

xzabzqsa  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(313)

在我的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

gywdnpxw

gywdnpxw1#

您使用了错误的数据类型。mysql类型 DATE 表示仅限日期的值,不含一天中的时间和时区。相比之下 java.sql.Timestamp 类表示一个时刻、时间线上的一个特定点、以utc表示的一天中某个时间的日期。方钉,圆孔。
只使用java.time类。永远不要使用可怕的遗留日期时间类,例如 Timestamp .
对于mysql DATE 使用 java.time.LocalDate 使用符合jdbc 4.2或更高版本的jdbc驱动程序。

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

vbkedwbf2#

利用 java.time.LocalDateTime 这是时区意识和应该帮助你很多。。。
timestamp是黑暗时代遗留下来的可怕的东西:)

相关问题