猿问
下载APP

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

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

在Java应用程序中,使用日期时间和时间戳的混合在MySQL数据库中提取和输入日期信息方面会有什么好处?



MMTTMM
浏览 151回答 3
3回答

隔江千里

在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。精度取决于数据库,通常以毫秒为单位,如Java,但也可以在几秒钟内完成。相反java.util.Date,java.sql.Date仅包含有关日期部分(年,月,日)的信息。它Time仅包含有关时间部分(小时,分钟,秒)的Timestamp信息,并包含有关这两个部分的信息,如同java.util.Date。在DB中存储时间戳的常规做法(因此,java.util.Date在Java端和java.sql.TimestampJDBC端)是使用的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.

蝴蝶不菲

MySQL 文档包含有关将MySQL类型映射到Java类型的信息。通常,对于MySQL日期时间和时间戳,您应该使用java.sql.Timestamp。一些资源包括:http://dev.mysql.com/doc/refman/5.1/en/datetime.htmlhttp://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversionhttp://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html编辑:正如其他人所指出的那样,使用字符串的建议可能会导致问题。

不负相思意

BalusC对该问题进行了很好的描述,但缺乏一个好的端到端代码,用户可以自己选择并测试它。最佳做法是始终将日期时间以UTC时区存储在DB中。Sql时间戳类型没有时区信息。将datetime值写入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时,在java.sql.Timestamp类型中读取它。使用LocalDateTime类中的atZone方法将DateTime值设置为UTC时区中的时间。然后,将其更改为您想要的时区。我在这里将它改为多伦多时区。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"));
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答