我正在尝试通过 sql 中的 GETUTCDATE() 函数将当前 UTC 时间的日期时间插入到 mysql 数据库中。它失败并显示“FUNCTION GETUTCDATE DOES NOT EXIST”。
有一种方法可以让我从 Java 获取 sql 日期时间格式的当前 UTC 时间,然后将其作为字符串插入吗?
我遇到的另一个大问题是我需要将上面的 utc datetime 对象转换为本地时区,但我真的不知道如何通过标准 java api 来做到这一点。
最佳答案
tl;博士
myPreparedStatement // Using a `PreparedStatement` avoids SQL-injection security risk.
.setObject( // As of JDBC 4.2, we can exchange java.time objects with a database via `getObject`/`setObject` methods.
… , // Indicate which `?` placeholder in your SQL statement.
OffsetDateTime.now( ZoneOffset.UTC ) // Capture the current moment in UTC.
) ;
java.time
现代解决方案使用多年前取代了可怕的旧日期时间类的 java.time 类。
使用 OffsetDateTime
获取 UTC 的当前时刻.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
MySQL 8.0 使用分辨率 microseconds ,小数秒内有六位小数。 java.time 类具有更精细的分辨率 nanoseconds 。所以你可能想要truncate any existing nanos从您的 OffsetDateTime
开始。使用 ChronoUnit
指定您所需的分辨率.
OffsetDateTime odt =
OffsetDateTime
.now(
ZoneOffset.UTC
)
.truncatedTo( ChronoUnit.MICROS )
;
通过 PreparedStatement
发送到您的数据库类似于 SQL 标准 TIMESTAMP WITH TIME ZONE
数据类型的列。对于 MySQL 8.0,这将是类型 TIMESTAMP
。
myPreparedStatement.setObject( … , odt ) ;
并通过 ResultSet
进行检索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
要通过特定地区(时区)的人们使用的挂钟时间来了解这一时刻,请应用 ZoneId
来获取 ZonedDateTime
对象。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ; // Same moment, same point on the timeline, different wall-clock time.
<小时/>
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。
要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .
您可以直接与数据库交换java.time对象。使用JDBC driver符合JDBC 4.2或稍后。不需要字符串,不需要 java.sql.*
类。
从哪里获取java.time类?
- > Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11以及后来的版本 - 具有捆绑实现的标准 Java API 的一部分。
- Java 9 添加了一些小功能和修复。
- > Java SE 6和 Java SE 7
- 大多数 java.time 功能已向后移植到 ThreeTen-Backport 中的 Java 6 和 7 .
- > Android
- Android 的更高版本捆绑了 java.time 类的实现。
- 对于早期的 Android (<26),ThreeTenABP项目适应ThreeTen-Backport (上文提到的)。参见 How to use ThreeTenABP… .
ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
,和more .
关于java - 将当前 UTC 时间的日期时间插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53330472/