在java应用程序中,对于混合使用datetimes和timestamps的MySQL数据库,在提取和输入日期信息方面有什么好的折衷方案?
发布于 2010-07-24 12:53:29
在Java端,日期通常由(设计不佳,但暂且不提) java.util.Date表示。它基本上是由long风格的Epoch time支持的,也称为时间戳。它包含有关日期和时间部分的信息。在Java中,精度以毫秒为单位。
在SQL端,有几种标准日期和时间类型,DATE、TIME和TIMESTAMP (在某些数据库中也称为DATETIME),它们在JDBC中表示为java.sql.Date、java.sql.Time和java.sql.Timestamp,它们都是java.util.Date的子类。精度依赖于DB,通常像Java那样以毫秒为单位,但也可以以秒为单位。
与java.util.Date相反,java.sql.Date只包含关于日期部分(年、月、日)的信息。与java.util.Date一样,Time只包含关于时间部分(小时、分钟、秒)的信息,而Timestamp包含关于这两个部分的信息。
在DB中存储时间戳(因此,Java端使用java.util.Date,JDBC端使用java.sql.Timestamp )的通常做法是使用PreparedStatement#setTimestamp()。
java.util.Date date = getItSomehow();
Timestamp timestamp = new Timestamp(date.getTime());
preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?");
preparedStatement.setTimestamp(1, timestamp);从数据库获取时间戳的正常做法是使用ResultSet#getTimestamp()。
Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.发布于 2010-07-24 12:36:15
MySQL documentation提供了关于将MySQL类型映射到Java的信息。通常,对于MySQL日期时间和时间戳,您应该使用java.sql.Timestamp。一些资源包括:
http://dev.mysql.com/doc/refman/5.1/en/datetime.html
http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion
How to store Java Date to Mysql datetime...?
编辑:
正如其他人所指出的,建议使用字符串可能会导致问题。
发布于 2018-04-24 22:56:28
BalusC对这个问题进行了很好的描述,但它缺乏一个好的端到端代码,用户可以自己挑选和测试它。
最佳做法是始终将日期-时间存储在数据库的UTC时区中。Sql timestamp类型没有时区信息。
将日期时间值写入sql db时
//Convert the time into UTC and build Timestamp object.
Timestamp ts = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
//use setTimestamp on preparedstatement
preparedStatement.setTimestamp(1, ts);当将值从DB读回到java中时,
时间戳ResultSet = preparedStatement.executeQuery();resultSet.next();resultSet resultSet= resultSet.getTimestamp(1);ZonedDateTime timeInUTC =resultSet LocalDateTime timeInToronto = Timestamp
https://stackoverflow.com/questions/3323618
复制相似问题