首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中处理MySQL日期时间和时间戳

问在Java中处理MySQL日期时间和时间戳
EN

Stack Overflow用户
提问于 2010-07-24 10:53:55
回答 3查看 119.8K关注 0票数 66

在java应用程序中,对于混合使用datetimes和timestamps的MySQL数据库,在提取和输入日期信息方面有什么好的折衷方案?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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()。

代码语言:javascript
复制
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()。

代码语言:javascript
复制
Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.
票数 112
EN

Stack Overflow用户

发布于 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...?

http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html

编辑:

正如其他人所指出的,建议使用字符串可能会导致问题。

票数 8
EN

Stack Overflow用户

发布于 2018-04-24 22:56:28

BalusC对这个问题进行了很好的描述,但它缺乏一个好的端到端代码,用户可以自己挑选和测试它。

最佳做法是始终将日期-时间存储在数据库的UTC时区中。Sql timestamp类型没有时区信息。

将日期时间值写入sql db时

代码语言:javascript
复制
    //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中时,

  1. 按java.sql.Timestamp类型读取它。
  2. 使用LocalDateTime类中的atZone方法将DateTime值修饰为UTC时区中的时间。然后
  3. ,将其更改为所需的时区。这里我把它改成了多伦多时区。

时间戳ResultSet = preparedStatement.executeQuery();resultSet.next();resultSet resultSet= resultSet.getTimestamp(1);ZonedDateTime timeInUTC =resultSet LocalDateTime timeInToronto = Timestamp

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3323618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档