【问题标题】:Add UTC date and time to database in java在java中将UTC日期和时间添加到数据库
【发布时间】:2019-10-07 10:23:23
【问题描述】:

我想将 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。所以现在我使用 Instant date time 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 日期?提前谢谢你。

【问题讨论】:

  • 你保存到什么 MySQL 数据类型?我没有经验,但我希望 timestamp 在 UTC 日期时间上比 datetime 工作得更好。
  • 我正在保存到我的 mysql 数据库中的 Timestamp 数据类型

标签: java mysql datetime


【解决方案1】:

JDBC 4.2

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

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

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

恭喜你离开 SimpleDateFormatDateTimestamp。他们有时间,但总是设计得很糟糕,所以我同意不使用它们。

【讨论】:

  • 我收到此错误:com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '\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' 列
  • 那太糟糕了。我不能立即说出原因。我尝试将错误消息粘贴到我的搜索引擎中,但它似乎主要是在查找消息来自旧日期时间类的示例。您可以尝试更深入地搜索。
【解决方案2】:

你做得对。这是因为 Mysql 数据库自动将 UTC DateTime 转换为系统时区。如果你真的想要 UTC DateTime 那么你可以将 MySQL 数据库的时区设置为

SET TIME_ZONE='+00:00';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2018-06-03
    相关资源
    最近更新 更多