处理Java中的MySQL日期时间和时间戳处理Java中的MySQL日期时间和时间戳(Handlin

2019-05-10 19:45发布

在Java应用程序会在什么和extracing使用日期时间和时间戳的混合MySQL数据库输入日期信息方面有很好的妥协?

Answer 1:

在Java侧,日期通常由表示(设计不当,但除外) java.util.Date 。 它基本上是由支持大纪元时间的味道long ,也被称为时间戳。 它包含两个日期和时间部分信息。 在Java中,精度为毫秒。

在SQL方面,有几个标准的日期和时间类型, DATETIMETIMESTAMP (在一些DB的也叫DATETIME ),这是在JDBC表示为java.sql.Datejava.sql.Timejava.sql.Timestamp ,所有子类 java.util.Date 。 精度是DB依赖,常像Java毫秒,但它也可以在几秒钟。

在违背java.util.Datejava.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中,

  1. 读它,因为它是在java.sql.Timestamp中的类型。
  2. 如使用atZone方法LocalDateTime类时间UTC时区装饰DateTime值。
  3. 然后,将其更改为您所需的时区。 在这里,我将其更改为多伦多时区。

     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")); 


文章来源: Handling MySQL datetimes and timestamps in Java