首页 > 解决方案 > 在java中将UTC日期和时间添加到数据库

问题描述

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

        //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

它有效,但我发现不建议使用 SimpleDateFormat。所以现在我使用即时日期时间 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 日期呢?先感谢您。

标签: javamysqldatetime

解决方案


JDBC 4.2

    ps.setObject(1, currentInstant.atOffset(ZoneOffset.UTC));

从 JDBC 4.2 开始,我们可以直接将 java.time 对象传入和传出 JDBC 对象,例如PreparedStatementResultSet。也许令人惊讶的是,我们应该不再使用setTimestamp或类似的特定方法,而只是setObjectand getObject。通过这种方式,他们设法在不更改 API 规范(方法setObject并且getObject已经存在)的情况下添加了新功能。

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

并祝贺你离开SimpleDateFormat,落后。他们有时间,但总是设计得很糟糕,所以我同意不使用它们。DateTimestamp


推荐阅读