在java中向数据库添加UTC日期和时间

在java中向数据库添加UTC日期和时间,java,mysql,datetime,Java,Mysql,Datetime,我想将UTC日期和时间作为时间戳添加到我的mysql数据库中。之前,我尝试将SimpleDataFormat用作: //UTC based issued date and expiry date SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); final

我想将UTC日期和时间作为时间戳添加到我的mysql数据库中。之前,我尝试将SimpleDataFormat用作:

        //UTC based issued date and expiry date
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        final String currentUtc= sdf.format(new Date());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date currentDate = (Date) simpleDateFormat.parse(currentUtc); //java.util.date
它起作用了,但我发现不推荐使用SimpleDataFormat。因此,现在我使用即时日期时间api作为:

 Instant currentInstant = Instant.now().truncatedTo(ChronoUnit.SECONDS); //gives UTC datetime
它正确地给出了UTC的当前时间。 问题是,当我将这个瞬间添加到数据库中时,它会通过将UTC时间偏移量添加到我不想要的那个瞬间而转换为本地日期

    //adding UTC time to database but not working
    ps.setTimestamp(1, Timestamp.from(currentInstant)); 
那么,如何在不向数据库中添加UTC时间偏移量的情况下添加UTC日期呢?提前感谢您。

JDBC 4.2 由于JDBC4.2,我们可以直接向JDBC对象传递java.time对象,或者从JDBC对象传递java.time对象,比如
PreparedStatement
ResultSet
。也许令人惊讶的是,我们不应该再使用
setTimestamp
或类似的特定方法,而应该只使用
setObject
getObject
。通过这种方式,他们在不更改API规范的情况下添加了新功能(方法
setObject
getObject
已经存在)

一些JDBC驱动程序只接受ps.setObject(1,currentInstant),这是符合逻辑的。我不记得Connector/J for MySQL是否有。在任何情况下,JDBC标准中都没有指定它,它要求使用
OffsetDateTime
而不是
Instant
。所以我会使用上面较长的形式,它转换为
OffsetDateTime
,如果只是为了便于移植的话


祝贺您将
SimpleDateFormat
Date
Timestamp
抛在脑后。它们有自己的时间,但都设计得很糟糕,所以我同意不使用它们。

你做得对。这是因为Mysql数据库自动将UTC日期时间转换为系统时区。如果您确实需要UTC日期时间,那么可以将MySQL数据库的时区设置为

SET TIME_ZONE='+00:00';

您要保存到哪个MySQL数据类型?我没有这方面的经验,但我希望UTC日期时间的
timestamp
datetime
工作得更好。我正在mysql数据库中保存为timestamp数据类型。我收到以下错误:com.mysql.jdbc.MysqlDataTruncation:数据截断:不正确的日期时间值:'\xAC\xED\x00\x05sr\x00\x0Djava.time.Ser\x95]\x84\xBA\x1B“H\xB2\x0C\x00\x00xpw\x0B\x0A\x00\x00\x07\xE3\x05\x15\x05\x01\xF8\x00x”用于列,这太糟糕了。我不能马上说为什么。我尝试将错误消息粘贴到搜索引擎中,但它似乎主要是查找旧日期时间类中消息来源的示例。你可以试着深入搜索。
SET TIME_ZONE='+00:00';