java - 在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 日期呢?先感谢您。
解决方案
JDBC 4.2
ps.setObject(1, currentInstant.atOffset(ZoneOffset.UTC));
从 JDBC 4.2 开始,我们可以直接将 java.time 对象传入和传出 JDBC 对象,例如PreparedStatement
和ResultSet
。也许令人惊讶的是,我们应该不再使用setTimestamp
或类似的特定方法,而只是setObject
and getObject
。通过这种方式,他们设法在不更改 API 规范(方法setObject
并且getObject
已经存在)的情况下添加了新功能。
一些 JDBC 驱动程序接受 just ps.setObject(1, currentInstant);
,这是合乎逻辑的。我不记得 Connector/J for MySQL 是否有。在任何情况下,它都没有在 JDBC 标准中指定,它需要一个OffsetDateTime
而不是一个Instant
. 所以我会使用上面更长的形式,它转换为OffsetDateTime
,如果只是为了可移植性。
并祝贺你离开SimpleDateFormat
,落后。他们有时间,但总是设计得很糟糕,所以我同意不使用它们。Date
Timestamp
推荐阅读
- openstack - OpenStack 多节点设置不在仪表板上显示 VM 映像
- reactjs - 在 redux 的操作中使用 axios 或异步网络调用,更新初始状态
- python - Dask 合并的左右行为不同
- .net - .NET 4.6.1 项目引用的 .NET Standard 2.0 库 - 引用的绘图库版本错误
- java - Java 中的输出问题
- python - 向 setup.py sdist 添加符号链接
- javascript - React - 使用 .map 函数和新的 Array.fill 更新二维数组的状态并用随机数填充
- react-native - React Native - 如何将车轮选择器数据的格式从 1 更改为 01
- python - 如何解码转义的 Unicode 字符?
- java - Weblogic 12c 无法访问选定的应用程序。无法加载与 e=web-fragment 对应的 java 类型