你可能会感到困惑:
java.util.Date
以 UTC表示日期和时间的类
java.sql.Date
表示仅日期、没有时间和没有时区的类。
实际上,java.sql.Date 扩展了 java.util.Date 所以它实际上继承了时间,但通过将其设置为00:00:00.0
UTC 来假装没有时间。类文档告诉你忽略继承关系(这是一个黑客)。令人困惑?是的,这些旧的日期时间类是一团糟、设计不佳、令人困惑和麻烦。
这些旧类被Java 8 及更高版本中内置的java.time类所取代。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
如果您的数据库列的类型类似于 SQL 标准类型 TIMESTAMP WITH TIME ZONE,那么您可以使用:
Instant
UTC 时间轴上的一个时刻,分辨率高达纳秒。
Instant instant = Instant.now();
ZonedDateTime
像一个Instant
但调整到一个特定的时区。
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
如果您的 JDBC 驱动程序符合 JDBC 4.2 规范,您可以通过setObject
.PreparedStatement
如果您的驱动程序不支持直接使用 java.time 类型,请回退到使用 java.sql 类型。查找添加到旧类的新方法,用于与 java.time 类型之间的转换。您正在寻找java.sql.Timestamp
一个特别是日期时间值的类,它可以转换为/从Instant
. 您可以从 aZonedDateTime
中提取一个Instant
用于此转换目的。
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
往另一个方向走。
Instant instant = mySqlTimestamp.toInstant();