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

Luc*_*mos 5 java mysql time date java-8

为这个有点广泛的问题提前道歉.

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

我需要能够将日期和时间的String表示转换为给定的日期格式,然后将该日期和时间存储在数据库中.然后我需要反过来并将MySQL日期和时间转换为相应的Java表示

我已经阅读了很多关于Date,DateTime,ZonedDateTime的问题,但这些问题似乎都没有.

谢谢.

ass*_*ias 7

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

字符串和LocalDateTime之间的转换

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

LocalDateTime dateTime = LocalDateTime.parse(dateAsString, fmt);
String dateAsString = dateTime.format(fmt);
Run Code Online (Sandbox Code Playgroud)

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

如果驱动程序符合JDBC 4.2(最新版本的mysql Java连接器应兼容),则可以执行以下操作:

LocalDateTime dateTime = rs.getObject(1, LocalDateTime.class);
preparedStatement.setObject(1, dateTime);
Run Code Online (Sandbox Code Playgroud)

不兼容的驱动程序

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

然后,您可以使用以下方法进行来回转换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();
Run Code Online (Sandbox Code Playgroud)


Ari*_*rld 4

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

最合适的 MySQL 类型是 DATETIME。请参阅我应该使用字段“日期时间”还是“时间戳”?

在持久层中使用的相应 Java 类型(jdbc 类型)是 java.sql.Timestamp。请参阅Java、JDBC 和 MySQL 类型

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

正确的变换是: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 ) 进行了一些增强,以简化转换。对于上面说明的情况,您可以使用toLocalDateTimevalueOf在 java.sql.Timestamp 和新的 java.time.LocalDateTime 之间进行转换。