【问题标题】:Spring Hibernate JPA Java8 OffsetTimeSpring Hibernate JPA Java8 OffsetTime
【发布时间】:2018-07-30 14:55:43
【问题描述】:

我创建了一个具有 OffsetTime 列的休眠实体。在保存带有时间偏移的时间值时,例如(+05:00),它会丢弃时间偏移,并根据系统时区保存带有时间偏移的时间。这是我在实体中的专栏:

@Column(name = "start_time", nullable = false)
private OffsetTime startTime;

如果我尝试保存“12:15+01:00”。它保存“12:15+00:00”,如果我的机器在 UTC 时区,如果我的机器在 IST 时区,它保存“12:15+05:00”。无论机器的时区如何,我都希望它保存“12:15+01:00”。

请建议我需要更正/审查的内容以确保我解决此问题。

谢谢。

【问题讨论】:

  • 您使用哪个数据库?
  • 如果您使用的是 MySQL,它不会存储时区偏移量,只是将其切断。您最好将其存储为 Epoch 长整数或将所有内容都转换为 UTC。

标签: spring hibernate jpa java-8 timezone-offset


【解决方案1】:

问题是如何设置值。您没有显示您的设置方法。您要么从 String 解析它,要么操作您转换为 OffsetTimeTemporal 的某些实例,如果您不想使用默认偏移量,则需要提供所需的偏移量。假设您想使用给定的偏移量保存当前时间。所以你必须这样做:

OffsetTime startTime = OffsetTime.of(LocalTime.now, ZoneOffset.of("+05:00");

参见方法of()以及OffsetTime的其他方法

【讨论】:

  • 我在 spring rest 端点接收时间作为 json 输入。例如在邮递员中测试端点时,我在 json 字段中使用“12:15+01:00”。我在端点控制器中看到,我有正确的信息为“12:15+01:00”,但是当我调用 Spring Data Hibernate Repository 并传递此实体时,数据库正确显示时间“12:15+xx:xx”,但是xx:xx 不是我传递的,而是在数据库中添加了默认的系统时间偏移量。
  • 在这种情况下,您可以在 @Column 注释上方添加以下注释:@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="HH:mmZ")
  • 我认为你错了,这是架构:1. FE 服务调用(JSON 正文包含时间“12:15+01:00”)=> 2. 控制器将 http 请求正文解析为DTO => 3. 控制器调用服务 class=> 3. 服务类通过映射转换为实体 => 4. 服务类调用 Spring Data Hibernate 存储库 => 5. Spring 数据更新 DB Spring 将 json 主体正确反序列化为 DTO,服务使用正确的数据调用存储库,但是一旦 Spring 数据更新 DB,它会通过默认系统偏移量覆盖设置的时间偏移量。
  • 如果我上面的解释不清楚,我可以重新给你解释一下吗?
  • 你的解释很清楚。但是现在我不确定问题出在哪里,这就是我没有回复的原因
猜你喜欢
  • 2015-05-26
  • 1970-01-01
  • 2011-10-19
  • 2019-07-20
  • 2011-01-04
  • 2015-09-13
  • 2016-06-26
  • 2015-11-24
  • 2016-10-15
相关资源
最近更新 更多