在数据库中插入具有当前UTC时间的日期时间



我正试图通过sql中的GEUTCDATE((函数将当前UTC时间的日期时间插入到mysql数据库中。它以"FUNCTION GEUTCDATE NOT EXIST"失败。

有没有一种方法可以让我从Java中获得sql日期时间格式的当前UTC时间,并简单地将其作为字符串插入?

我遇到的另一个大问题是,我需要将上面的utc-datetime对象转换为本地时区,而我真的不知道如何通过标准的javaapi来实现这一点。

tl;dr

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使用微秒的分辨率,即小数秒内的六位小数。java.time类具有更精细的纳秒分辨率。因此,您可能想要从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框架构建在Java8及更高版本中。这些类取代了诸如java.util.DateCalendar和&SimpleDateFormat

现在处于维护模式的JodaTime项目建议迁移到java.Time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*类。

从哪里获得java.time类?

  • Java SE 8Java SE 9Java SE 10爪哇SE 11及更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些小功能和修复程序
  • Java SE 6Java SE 7
    • 大多数Java.time功能都是向后移植到Java 6&7英寸ThreeTen背包
  • Android
    • java.time类的Android捆绑包的后续版本
    • 对于早期的Android(<26(,ThreeTenABP项目适用于ThreeTen Backport(如上所述(。请参阅如何使用ThreeTenABP…

ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。

您可以按如下方式执行:

OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
String sql_date = utc.format(DateTimeFormatter.ofPattern("MM/dd/yyyy")); //here, you can change the format of SQL date as you need

您需要按如下方式导入类:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

希望能有所帮助。

最新更新