从java插入时,日期在mariadb中存储错误
我在angular datepicker中选择日期为2019年2月8日,在java端日志中,它打印为从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日。。 对不
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+个信誉点,你可以根据自己的意愿选择任意多个答案。