【问题标题】:How to choose correct date type for spring controller?如何为弹簧控制器选择正确的日期类型?
【发布时间】:2021-07-13 09:06:03
【问题描述】:

我需要像这样实现端点:

@GetMapping("/localdatetime")
public SomeObhject dateTime(@RequestParam("localDateTime") LocalDateTime date) {

按日期它应该从数据库中查询并返回给客户端。

我的问题是我应该使用哪种日期类型?

  • 本地日期时间
  • 分区日期时间
  • 偏移日期时间

?

还有什么?

有哪些优点和缺点?

AFAIK 传递日期的最佳方式 - 以 UTC 格式传递它,但它不能直接回答我的问题。

【问题讨论】:

  • 这取决于 - 如果时区相关,请使用 ZonedDateTime。如果没有,LocalDateTime 通常是最合适的。
  • @1615903 你能解释一下如果时区相关这个短语吗?客户端和服务器可能位于不同的时区
  • 在这种情况下:“它应该从数据库查询 smth 的日期” - 它是您数据库中的 something 确定时区是否相关或不是。请参阅@MichaelGantman 的答案以获得很好的解释。

标签: java spring spring-boot zoneddatetime localdatetime


【解决方案1】:

LocalDateTime 不保留时区信息,因此如果不提供其他信息 - 时区,则无法及时转换为准确的时刻。 OffsetDateTime 和 ZonedDatetime 都保存时区信息, ZonedDatetime 保存更多信息,请在 Javadoc 中阅读。如果您的应用程序不需要考虑时区(例如,它是一个用于本地化使用的应用程序,并且所有时间都假定始终处于本地时区),那么使用 LocalDateTime 比其他人更简单,而且其他人将持有一些冗余信息。但是,如果您确实需要考虑时区,那么您需要保存此信息的两个之一。如果我需要考虑时区,我个人更喜欢使用 ZonedDatetime

【讨论】:

  • 如果我们将日期作为 UTC 时间戳传递,我们可以使用任何一种:LocalDateTime、ZonedDateTime 或 OffsetDateTime 是否正确?
  • 其实我不需要确切的客户时区但我需要知道时刻
  • 不,如果您希望您的时间采用 UTC - 这是一个时区,您不能使用 LocalDateTime。您必须使用 ZonedDateTime 或 OffsetDateTime,因为您确实考虑了时区
  • 我的意思是客户负责转换成UTC时区。并且服务器期望它作为 UTC 传递。您的意思是 Spring 控制器会将过去的日期视为他的本地日期吗?
  • 不,如果你使用 LocalDateTime 那么服务器将不知道也不关心时区。您所说的是您想假设所有时间都在UTC,但您不想保留该信息。因此,当您想要将 LocalDateTime 转换为时刻时,您必须告知您的时间应该被视为 UTC。查看这个问题的答案:stackoverflow.com/questions/35610597/…
猜你喜欢
  • 2019-06-04
  • 2015-06-14
  • 1970-01-01
  • 2020-05-16
  • 2011-07-13
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2020-12-19
相关资源
最近更新 更多