java - 将当前 UTC 时间的日期时间插入数据库

标签 java mysql datetime java-8

我正在尝试通过 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类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于java - 将当前 UTC 时间的日期时间插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53330472/

相关文章:

java - 在 Ant 中,<sourcepath> 和 <src> 元素有什么区别?

java - 如何将基于 Java 的 Cassandra 客户端连接到 Cassandra 集群,而不是特定节点?

java - 从 URL 获取文件名

php - 如果没有数据更改,Codeigniter update_batch 返回 false

mysql - 用于获取不同类别和相关子类别的嵌套查询 Laravel

sql - SQL查询的性能

java - IntelliJ/Gradle 无法从 '11.0.1' 确定 java 版本

MySQL Left Join(我认为)困难

postgresql - 获取表的最后一个值的时间越来越长

asp.net - 是否有标准方法来表示 ASP.NET 中的 TSQL 最小日期