首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >joda-time和Hibernate - Date不存储在UTC中。

joda-time和Hibernate - Date不存储在UTC中。
EN

Stack Overflow用户
提问于 2015-09-03 17:24:49
回答 1查看 1K关注 0票数 1

我使用DateTime在我的服务器上以UTC-Time存储时间戳:

代码语言:javascript
运行
复制
// @Entity ..
@NotNull
@Column(name="DATE")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime date;

在服务器启动过程中,我会这样做:

代码语言:javascript
运行
复制
DateTimeZone.setDefault(DateTimeZone.UTC);

为了确保new DateTime()总是在UTC时间,我是如何准备一个日期来存储的:

代码语言:javascript
运行
复制
DateTime utc = new DateTime();
utc = utc.dayOfMonth().roundFloorCopy();

DateTime thisMonday = utc.withDayOfWeek(DateTimeConstants.MONDAY);
DateTime thisTuesday = thisMonday.plusDays(1);

如果我正在调试这个程序,我会看到。

2015-08-31 00:00:002015-09-01 00:00:00

但是当我查看数据库时,我发现

2015-08-31 02:00:002015-09-01 02:00:00

被储存在那里。是+2h,这是我当地的UTC偏移量(柏林/维也纳)。

为什么会发生这种情况,我如何确保我的服务器一直存储在UTC中?

EN

回答 1

Stack Overflow用户

发布于 2015-09-08 19:27:10

您正在使用Jadira将JodaTime类型转换为SQL /time类型。使用这些JPA/Hibernate属性告诉Jadira在向DB发送数据时应该应用哪个时区

代码语言:javascript
运行
复制
<properties>
    <property name="jadira.usertype.javaZone" value="UTC" /> <!-- or "jvm" to use your default JVM TZ, explicit Europe/Berlin or +02:00 etc. -->
    <property name="jadira.usertype.databaseZone" value="UTC" /> <!-- or "jvm" to use your default JVM TZ or +02:00 etc. But you'd better not use an explicit TZ with a DST change -->
</properties>

详情请参见Jadira用户指南

另一件事是,也许您的DB正在使用连接信息来显示时区中的时间戳?这取决于它是哪个DB,以及用于连接的工具。SQL Developer (对于Oracle DB)知道计算机的TZ,并将连接TZ设置为TZ。

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

https://stackoverflow.com/questions/32381914

复制
相关文章

相似问题

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