【问题标题】:Most appropriate SQL and Java data types for storing date and time [duplicate]用于存储日期和时间的最合适的 SQL 和 Java 数据类型 [重复]
【发布时间】: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 问题-红色油漆涂层”将帮助卡车更好地运行。

标签: java mysql date time java-8


【解决方案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 变量指的是什么?
    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多