用于存储日期和时间的最合适的 SQL 和 Java 数据类型 [重复]

Posted

技术标签:

【中文标题】用于存储日期和时间的最合适的 SQL 和 Java 数据类型 [重复]【英文标题】:Most appropriate SQL and Java data types for storing date and time [duplicate] 【发布时间】:2017-03-02 04:51:40 【问题描述】:

提前为这个有点宽泛的问题道歉。

什么是处理日期和时间最合适的 mysql 和 Java 数据类型,格式如下:yyyy.MM.dd hh:mm:ss

我需要能够将日期和时间的字符串表示形式转换为给定的日期格式,然后将该日期和时间存储在数据库中。然后我需要做相反的事情并将 MySQL 日期和时间转换为相应的 Java 表示

我已经阅读了很多关于 Date、DateTime、ZonedDateTime 的问题,但这些问题似乎都不起作用。

谢谢。

【问题讨论】:

谢谢,我确实尝试过,但没有成功,虽然我忘记了原因。 所以你尝试了 java.util.Date 和 java.text.SimpleDateFormat? 是的,我尝试了该帖子中推荐的内容。我认为这是某种转换错误。我听说 Java 8 提供了更好的方法来处理日期和时间,所以我认为可能会有一个新的、更好的解决方案。 您将能够使用稍旧版本的 Java 与 DB 对话!错误是 SQL 错误还是 Java 错误 @LucasAmos “我听说 Java 8 提供了更好的方法来处理日期和时间”是的,更清晰的概念,更好的日期算术,但这些将像“法拉利”一样帮助您解决 mysql 问题-红色油漆涂层”将帮助卡车更好地运行。 【参考方案1】:

在您的情况下,mysql 类型为DATETIME,Java 8 类型为LocalDateTime

String与LocalDateTime的转换

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm:ss");

LocalDateTime dateTime = LocalDateTime.parse(dateAsString, fmt);
String dateAsString = dateTime.format(fmt);

与数据库交互(JDBC 4.2 兼容驱动)

如果驱动兼容JDBC 4.2(最新版本的mysql Java连接器应该兼容),可以这样做:

LocalDateTime dateTime = rs.getObject(1, LocalDateTime.class);
preparedStatement.setObject(1, dateTime);

不合规的驱动程序

如果您的驱动程序还不兼容,您可以像在 Java 8 之前那样将 DATETIME 字段存储/检索为 java.sql.Timestamp

然后您可以通过以下方式转换为LocalDateTime/从LocalDateTime 转换:

//from LocalDateTime to Timestamp:
java.time.LocalDateTime dateTime = LocalDateTime.parse(dateAsString, fmt);
java.sql.Timestamp ts = Timestamp.valueOf(dateTime);

//from Timestamp to LocalDateTime:
java.sql.Timestamp ts = resultSet.getTimestamp();
java.time.LocalDateTime dateTime = ts.toLocalDateTime();

【讨论】:

【参考方案2】:

什么是处理日期和时间最合适的 MySQL 和 Java 数据类型,格式如下:yyyy.MM.dd hh:mm:ss

最合适的 MySQL 类型是 DATETIME。见Should I use field 'datetime' or 'timestamp'?。

在持久层中使用的对应 Java 类型(jdbc 类型)是 java.sql.Timestamp。见Java, JDBC and MySQL Types。

我需要能够将日期和时间的字符串表示形式转换为给定的日期格式,然后将该日期和时间存储在数据库中。

正确的转换是:java.lang.String -> java.util.Date -> java.sql.Timestamp

java.lang.String -> java.util.Date

Date javaDatetime = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss").parse(stringDatetime);

java.util.Date -> java.sql.Timestamp

Timestamp jdbcDatetime = new Timestamp(javaDatetime.getTime());

然后我需要做相反的事情并将 MySQL 日期和时间转换为相应的 Java 表示

做反向路径:

java.sql.Timestamp -> java.util.Date

Date javaDatetime = new java.util.Date(jdbcDatetime.getTime());

java.lang.Date -> java.util.String

String stringDatetime = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss").format(javaDatetime);

我一直很简洁。您必须注意 SimpleDateFormat 的使用(例如缓存已使用 applyPattern 和 setLenient 初始化的实例)。

Java 8 更新 对简化转换的 jdbc 类型(请参阅JDBC 4.2)进行了一些增强。对于上面说明的情况,您可以使用 toLocalDateTime 和 valueOf 从 java.sql.Timestamp 转换为新的 java.time.LocalDateTime 并返回。

【讨论】:

接受的答案已经过时......我们从 java 8 和 jdbc 4.2+ 开始有更好的选择【参考方案3】:

您可以通过这种方式格式化您的代码:

SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dateUtil = DATE_FORMAT.parse(dateEcheance);
java.sql.Date dateSql = new java.sql.Date(dateUtil.getTime());

希望你能帮到你。

【讨论】:

谢谢,dateEcheance 变量指的是什么?

以上是关于用于存储日期和时间的最合适的 SQL 和 Java 数据类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 在 PostgreSQL 中存储时间的最推荐方法是啥?

在 SQL Server 2008 R2 和 SQL Server Compact 4 中存储日期/时间数据的最佳方式

SQL Server 日期格式不适用于存储过程

用于比较字符串(HH24MI)与日期的 Sql 查询帮助

Java8时间和日期API

Java8时间和日期API