Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java插入时,日期在mariadb中存储错误_Java_Angular_Date_Mariadb - Fatal编程技术网

从java插入时,日期在mariadb中存储错误

从java插入时,日期在mariadb中存储错误,java,angular,date,mariadb,Java,Angular,Date,Mariadb,我在angular datepicker中选择日期为2019年2月8日,在java端日志中,它打印为Fri feb 08 00:00:00 SGT 2019,但在数据库中,它存储为07/02/2019 16:00:00我在db端使用日期时间格式。java中的java.util.date。 如果我尝试使用数据库中存储为08/02/2019 00:00:00的同一日期获取,则这种情况会非常随机发生。 数据库时区为SGT 为什么会这样 [编辑]我选择的日期是2019年2月8日,而不是2月2日。。 对不

我在angular datepicker中选择日期为2019年2月8日,在java端日志中,它打印为
Fri feb 08 00:00:00 SGT 2019
,但在数据库中,它存储为
07/02/2019 16:00:00
我在db端使用日期时间格式。java中的
java.util.date
。 如果我尝试使用数据库中存储为
08/02/2019 00:00:00的同一日期获取,则这种情况会非常随机发生。

数据库时区为SGT

为什么会这样

[编辑]我选择的日期是2019年2月8日,而不是2月2日。。
对不起,2019年2月8日星期五00:00:00 SGT中的
SGT
表示时区,而DB中有UTC时间。这两个时代是历史上完全相同的时刻


在浏览器中选择日期总是发生在用户的时区。如果希望使用UTC计算时间,则需要对此进行调整。

java.util的日期-时间API及其格式化API
SimpleDateFormat
已经过时且容易出错。建议完全停止使用,并切换到。无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认

将所选日期转换为
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
现在,您可以在JDBC代码中使用
OffsetDateTime
,如下所示:

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();
}

了解现代日期时间API。应将值为
SGT
的属性
serverTimezone
添加到JDBC连接字符串中:

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

jdbc:mysql://

数据库中列的确切类型是什么?我使用的是DateTime typeCheck时区。@Neelimanelu-如果其中一个答案解决了您的问题,您可以通过将其标记为已接受来帮助社区。公认的答案有助于未来的访问者自信地使用解决方案。要进行此操作,您需要单击大复选标记(✓) 在答案的左边。注意:一个问题只能接受一个答案。但是,一旦你有15+个信誉点,你可以根据自己的意愿选择任意多个答案。