【问题标题】:JSON to java.sql.timestamp deserialization loses hours, causes date to lose a dayJSON 到 java.sql.timestamp 反序列化会丢失数小时,导致日期丢失一天
【发布时间】:2018-06-20 00:49:01
【问题描述】:

我有一个 Spring 应用程序,它的实体将日期存储为 java.sql.Timestamp。角度前端以yyyy-mm-dd 格式捕获更改,但是当 JSON 反序列化为时间戳时,它会丢失几个小时,最终结果是 dd 部分会丢失一天。

我知道这与时区有关,但无法找出最快的解决方案。有没有注释可以解决这个问题?

这是我的代码:

实体类变量

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Timestamp dateNeeded;

JSON 数据传入:

"DateNeeded": "2017-12-25"

我宁愿不必从java.sql.Timestamp 更改,但是已经看到了有关这种影响的指导……关于杰克逊与 java.sql 包不兼容的一些事情。这将是我最后的选择,并且更喜欢允许我保留时间戳的更改。

谢谢

【问题讨论】:

  • 这听起来像是您忽略了时区。如果您是真正的“印第安纳州人”,您可能比 UTC 晚 5 小时(尽管我相信印第安纳州是一个有随机时区的地方)。就这么多时间吗?
  • Timestamp 类已经过时了。你要执着于什么?
  • Ole,如果不是 Timestamp,你有什么建议?数据库是将数据存储为日期时间的 MySQL。
  • 我认为最好的解决方案是将MySQL中的数据类型更改为date,然后在Java中使用java.time.LocalDate。那么就没有时间可以处理或失去。如果您无法更改列类型,您可能应该在 Java 中使用LocalDateTime。
  • @OleV.V. - 感谢提及的提示和类型的建议。我试试看!

标签: java angularjs json timestamp


【解决方案1】:

问题是由于时区造成的。当您不指定时间时,它会将其设置为 00:00:000

然后将其转换为毫秒并构造一个 Timestamp 对象。并且由于本地时区有 UTC 的偏移量,因此会减去一些小时。

您必须将 dateNeeded 替换为递增的时间戳,即在存储之前由本地时区偏移量偏移的时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2022-08-02
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多