用于存储日期和时间的最合适的 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 中存储时间的最推荐方法是啥?