在Java应用程序会在什么和extracing使用日期时间和时间戳的混合MySQL数据库输入日期信息方面有很好的妥协?
Answer 1:
在Java侧,日期通常由表示(设计不当,但除外) java.util.Date
。 它基本上是由支持大纪元时间的味道long
,也被称为时间戳。 它包含两个日期和时间部分信息。 在Java中,精度为毫秒。
在SQL方面,有几个标准的日期和时间类型, DATE
, TIME
和TIMESTAMP
(在一些DB的也叫DATETIME
),这是在JDBC表示为java.sql.Date
, java.sql.Time
和java.sql.Timestamp
,所有子类 java.util.Date
。 精度是DB依赖,常像Java毫秒,但它也可以在几秒钟。
在违背java.util.Date
的java.sql.Date
包含日期部分(年,月,日),仅供参考。 该Time
包含在部分时间只有信息(小时,分,秒)和Timestamp
包含了两个部分信息,如为java.util.Date
一样。
通常的做法来存储在DB的时间戳(因此, java.util.Date
在Java端和java.sql.Timestamp
在JDBC侧)是使用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);
通常的做法,以获得从DB的时间戳是使用ResultSet#getTimestamp()
Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.
Answer 2:
MySQL的文档 ,对测绘的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
如何将Java日期存储到MySQL的日期时间...?
http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html
编辑:
正如其他人所指出的,使用字符串的建议可能导致的问题。
Answer 3:
BalusC给了这个问题一个很好的说明,但它缺乏一个良好的端到端的代码,用户可以选择并测试它自己。
最佳做法是始终存储日期,时间和UTC时区的DB。 SQL时间戳类型没有时区信息。
当写日期时间值SQL数据库
//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);
当从数据库读取值回Java中,
- 读它,因为它是在java.sql.Timestamp中的类型。
- 如使用atZone方法LocalDateTime类时间UTC时区装饰DateTime值。
然后,将其更改为您所需的时区。 在这里,我将其更改为多伦多时区。
ResultSet resultSet = preparedStatement.executeQuery(); resultSet.next(); Timestamp timestamp = resultSet.getTimestamp(1); ZonedDateTime timeInUTC = timestamp.toLocalDateTime().atZone(ZoneId.of("UTC")); LocalDateTime timeInToronto = LocalDateTime.ofInstant(timeInUTC.toInstant(), ZoneId.of("America/Toronto"));