我想将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日期呢?预先谢谢你。
答案 0 :(得分:1)
ps.setObject(1, currentInstant.atOffset(ZoneOffset.UTC));
自JDBC 4.2起,我们可以直接将Java.time对象与JDBC对象(例如PreparedStatement
和ResultSet
)传递。也许令人惊讶的是,我们不再应该使用setTimestamp
和setObject
或类似的特定方法。这样,他们设法在不更改API规范的情况下添加了新功能(方法getObject
和setObject
已经存在。)
某些JDBC驱动程序仅接受getObject
,这是合乎逻辑的。我不记得MySQL是否使用Connector / J。无论如何,在JDBC标准中都没有指定它,它要求使用ps.setObject(1, currentInstant);
而不是OffsetDateTime
。因此,如果仅出于便携性考虑,我将使用上面的较长表格,该表格会转换为Instant
。
并祝贺您将OffsetDateTime
,SimpleDateFormat
和Date
留在后面。他们有时间,但是设计总是很差,所以我同意不使用它们。
答案 1 :(得分:1)
您做得正确。这是因为Mysql数据库自动将UTC日期时间转换为系统时区。如果您确实需要UTC DateTime,则可以将MySQL数据库的时区设置为
SET TIME_ZONE='+00:00';