在Java中将UTC日期和时间添加到数据库

时间:2019-05-21 04:46:38

标签: java mysql datetime

我想将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日期呢?预先谢谢你。

2 个答案:

答案 0 :(得分:1)

JDBC 4.2

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

自JDBC 4.2起,我们可以直接将Java.time对象与JDBC对象(例如PreparedStatementResultSet)传递。也许令人惊讶的是,我们不再应该使用setTimestampsetObject或类似的特定方法。这样,他们设法在不更改API规范的情况下添加了新功能(方法getObjectsetObject已经存在。)

某些JDBC驱动程序仅接受getObject,这是合乎逻辑的。我不记得MySQL是否使用Connector / J。无论如何,在JDBC标准中都没有指定它,它要求使用ps.setObject(1, currentInstant);而不是OffsetDateTime。因此,如果仅出于便携性考虑,我将使用上面的较长表格,该表格会转换为Instant

并祝贺您将OffsetDateTimeSimpleDateFormatDate留在后面。他们有时间,但是设计总是很差,所以我同意不使用它们。

答案 1 :(得分:1)

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

SET TIME_ZONE='+00:00';