【问题标题】:Deserialize LocalDateTime from incoming JSON从传入的 JSON 反序列化 LocalDateTime
【发布时间】:2018-07-15 06:57:12
【问题描述】:

我已经创建了 Spring Boot REST Api,我需要处理包含 LocalDateTime 和 LocalDate 变量的 REST 控制器对象。

这是我的示例对象:

public class Foo {
   private LocalDateTime dateTime;
   private LocalDate date;

   // others variables, geeters and setters
}

和我的控制器:

@PostMapping("/foo")
public void fooApi(@RequestBody @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Foo foo) {
    // calling some service
}

我已经尝试了上面的解决方案,并发送了那个 json:

{  
   "dateTime":"2018-02-05T11:59:11.332Z",
   "date":"2018-02-05T11:59:11.332Z"
   ...
}

如您所见,我发送的时间是 12:59 .. 但控制器的命中时间是 11:59。 你能告诉我春天休息的正确日期和时间吗?我在 application.properties 中也有这个:

spring.jackson.serialization.write-dates-as-timestamps=false

感谢您的建议。

【问题讨论】:

  • 您正在发送带时区 (Z) 的时间,但 LocalDateTime 无法存储时区。
  • 那么我应该以什么格式发送呢?:/
  • 我花了一段时间才弄清楚toISOStringa Javascript method(不是Java)。

标签: json spring rest date localdate


【解决方案1】:

LocalDateTime 不包含任何时区信息。假设您想要没有时区的时间(本地时间)并接收客户端/用户的时间,您应该在没有时区的情况下发送:

{  
  "dateTime":"2018-02-05T12:59:11.332",
   ...
}

请注意,您的示例中的时间部分已更改为 12:59,并删除了 UTC 时区的 Z。

【讨论】:

    【解决方案2】:

    请更正 json 中的描述,您将通过 11:59,但您说您将通过 12:59。

    根据您提到的差异,这是因为时区。

    d.toISOString 以 UTC 格式给出日期。但是,d= new Date() 给出了时区(系统时区)的具体日期,在您的情况下,它是 CET(中欧时间),即 utc+01:00 表示比 UTC 时间提前 1 小时。

    【讨论】:

    • 我在邮递员中传递了与您在图片中看到的相同的日期,您能告诉我发送日期的正确形式是什么,以使 spring 能够检测时区吗?
    • 我可以看到你只想在 utc 时区通过,对吧?如果是,您是否使用杰克逊?默认情况下,杰克逊将 DateTime 的时区设置为 GMT,这在大多数情况下与 UTC 相同。但是,如果您真的想将格式指定为 UTC,请使用:objectMapper.setTimeZone(TimeZone.getTimeZone("UTC"))
    • 我稍后会实现 javascript 客户端,所以我会按照你的建议来做......现在我刚刚在邮递员中测试了我的 api,所以我从浏览器控制台获取当前日期,你可以在图片上看到并发送它到控制器。那么您推荐哪种格式?这个对象映射器是一个 bean?
    • 抱歉,我不是 javascript 专家。您应该编辑您的问题并添加 javascript 标签。通过看到rest和spring,我以为你的api只有java,不是这样吗?我建议您仅以 UTC 格式发送日期。您可以做的是作为您的 api 的响应,您可以给出时区特定的响应。只需考虑以与时区无关的形式存储和接收您的数据,并使用时区信息进行响应,以使客户的生活更轻松,并且存储也保持一致。此外,您应该将 api 中的显示就绪数据提供给您的 javascript 客户端。
    • 您还应该将显示就绪数据从您的 api 提供给您的 javascript 客户端。即以您想要的任何格式格式化日期,javascript客户端只是按原样显示它。想象一下,有一天你会为 android 和 ios 构建原生应用程序。你不想将转换逻辑复制到所有平台 :)
    猜你喜欢
    • 2021-01-19
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多