date在从java插入时在mariadb中存储错误

lyfkaqu1  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(353)

我在angular datepicker中选择日期为2019年2月8日,在java侧日志中,它被打印为 Fri Feb 08 00:00:00 SGT 2019 但在数据库中它存储为 07/02/2019 16:00:00 我在db端使用datetime格式。以及 java.util.date 在 java 。如果我尝试使用它存储的数据库中的相同日期获取数据,这种情况会非常随机地发生 08/02/2019 00:00:00. 数据库时区是sgt。
为什么会这样?
[编辑]我选择的日期是2019年2月8日,而不是2月2日。。对不起的

ghhaqwfi

ghhaqwfi1#

api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
将所选日期转换为 OffsetDateTime 并将其保存到数据库中。下面演示如何将日期字符串转换为 OffsetDateTime :

import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDate = "08/02/2019";
        DateTimeFormatter dtfForParsing = DateTimeFormatter.ofPattern("dd/MM/uuuu", Locale.ENGLISH);
        OffsetDateTime odt = LocalDate.parse(strDate, dtfForParsing).atStartOfDay(ZoneId.of("Asia/Singapore"))
                .toOffsetDateTime();
        System.out.println(odt);
    }
}

输出:

2019-02-08T00:00+08:00

现在,你可以用 OffsetDateTime 在jdbc代码中:

PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate(); 
st.close();

这就是如何从数据库中检索值:

String query = "SELECT * FROM mytable";
try (Statement stmt = con.createStatement()) {
    ResultSet rs = stmt.executeQuery(query);

    while (rs.next()) {
        // Assuming column 1 is the datetime column
        OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
        System.out.println(odt);
        // In a custom format e.g. display just the date
        System.out.println(odt.format(DateTimeFormatter.ofPattern("dd/MM/uuuu", Locale.ENGLISH)));
    }
} catch (SQLException e) {
    e.printStackTrace();
}

从trail:date-time了解现代日期时间api。

z9gpfhce

z9gpfhce2#

财产 serverTimezone 有价值的 SGT 应添加到jdbc连接字符串:

jdbc:mysql://<address>:<port>/<database>?serverTimezone=SGT

来自mysql文档:6.3.11 datetime类型处理

hgc7kmma

hgc7kmma3#

这个 SGTFri Feb 08 00:00:00 SGT 2019 表示时区,而在db中有utc时间。这两个时代是历史上完全相同的时刻。
在浏览器中选择日期总是发生在用户的时区。如果你想用utc来计算时间,你需要对此进行调整。

相关问题