首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring JDBC持久化ZonedDateTime

Spring JDBC持久化ZonedDateTime
EN

Stack Overflow用户
提问于 2017-10-19 04:40:58
回答 3查看 4.2K关注 0票数 2

我正在使用来自不同时区的终端可以访问的web门户的签到/签出功能。

我使用ZonedDateTime来计算给定的打卡/出卡记录的日期时间。

代码语言:javascript
复制
// Get store timezone
ZoneId storeTimeZone = this.storeService.getStoreZoneId(storeNum);

// Get current store time to use for punch in / out timestamp
ZonedDateTime currentStoreTime = ZonedDateTime.ofInstant(Instant.now(), storeTimeZone);

当我要将数据持久化到Oracle11g时,我不能持久化ZonedDateTime对象。JDBC驱动程序可能不支持。这是一个企业环境,所以数据库和驱动程序不会改变。

当我构建要传递到NamedParameterJdbcTemplate的MapSqlParamSource时,我不得不将其转换为java.sql.Timestamp,但随后我丢失了区域数据,并存储了服务器所在时区的时间戳,要求它必须存储在数据库中的存储时间中,这只是一个Oracle时间戳列。

代码语言:javascript
复制
params.addValue("clockInTimestamp", Timestamp.from(prevRecord.getTimeEntryTimestamp().toInstant()), Types.TIMESTAMP);

有没有办法实现持久化ZonedDateTime?

EN

回答 3

Stack Overflow用户

发布于 2020-02-06 01:20:24

我设法为MySQL解决了这个问题,这样它就可以为其他人工作了。我在添加到MapSqlParameterSource时添加了sqlType参数

代码语言:javascript
复制
ZonedDateTime zdt = ZonedDateTime.now();
LocalDateTime ldt = LocalDateTime.ofInstant(zdt.toInstant(), ZoneId.systemDefault());

MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("datetime", ldt, Types.JAVA_OBJECT);
票数 2
EN

Stack Overflow用户

发布于 2017-10-19 04:57:34

Sprint Boot项目将自动加载jsr310jpaconverters,但这将只处理LocalDateTime类型的转换,而不是ZonedDateTime。如果你没有使用Spring Boot,你可以自己加载这些额外的转换器。

您可能希望调整您的应用程序,以便在数据库交互级别使用这些应用程序,并且只强制将您保存的所有内容都放在一个标准时区中,以便在用户显示需要时可以轻松地转换为ZonedDateTime

票数 1
EN

Stack Overflow用户

发布于 2017-10-19 23:21:10

我能够解决这个问题,方法是将ZonedDateTime转换为Instant,然后使用时区偏移量手动计算时间戳。

示例代码如下:

代码语言:javascript
复制
ZonedDateTime timeEntry = ZonedDateTime.now();

ZoneOffset storeOffset = timeEntry.getOffset();
ZoneOffset serverOffset = ZonedDateTime.now().getOffset();

int secondsOffset = storeOffset.getTotalSeconds() - serverOffset.getTotalSeconds();

Instant entryTimestamp = timeEntry.toInstant().plusSeconds(secondsOffset);

Timestamp ts = Timestamp.from(entryTimestamp);

然后我将java.sql.Timestamp持久化到数据库中。

我确信这不是最干净或最好的解决方案,但由于不能更改数据库、驱动程序或其他工作方式的限制,它似乎做得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46818888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档