【问题标题】:Convert Time with offset to UTC and return localdatetime将带偏移量的时间转换为 UTC 并返回 localdatetime
【发布时间】:2020-05-01 01:41:27
【问题描述】:

我有一个根据 Iso8601 解析字符串并返回 LocalDateTime 的方法。 现在我接受可能的偏移量。 现在的问题是我必须将偏移量转换为 UTC 并将其作为 LocalDateTime 返回。

到目前为止,我已经尝试过使用 Instant、OffsetDateTime、ZonedDateTime。 我总是得到相反的结果。我的结果将显示为 -06:00,而不是 +06:00。

return LocalDateTime.ofInstant(Instant.from(OffsetDateTime.parse(date, buildIso8601Formatter())), ZoneOffset.UTC);

这是与我上面提到的其他尝试过的解决方案相同的解决方案。

我知道这不是常用的方法,因此我做了很多研究,但当前的架构只允许我这样做。

编辑示例: 使用这样的实现:

OffsetDateTime offsetDateTime = OffsetDateTime.parse(date, buildIso8601Formatter()); 
Instant instant = offsetDateTime.toInstant();


return LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

假设我得到"2020-01-12T08:30+06:00" 作为我的方法的输入。我必须返回 LocalDateTime。

因此,我想要"2020-01-12T14:30",而不是我最好的解决方案是相反的方式:"2020-01-12T02:30"

【问题讨论】:

  • 您尝试转换的时间是什么时候?你能把它和一些失败的尝试一起展示吗?
  • 如果您正在处理偏移量,为什么要使用LocalDateTime 而不是(正确的)使用OffsetDateTime
  • 什么“规则”使时间戳2020-01-12T08:30+06:00对应2020-01-12T14:30?我问是因为08:30+06:0002:30+00:00 是同一时间!
  • 根据偏移量,8:30 +6z == 2:30 +0z == 14:30 +12z 区域部分显示“这是 UTC 时间 + 无论偏移量是多少”
  • 我想告诉你,你想要的结果时间,与输入不对应!

标签: java date parsing time utc


【解决方案1】:

java.time 的行为是正确的。字符串2020-01-12T08:30+06:00 表示该字符串的日期时间部分是某个区域的日期时间local,该区域存在于与UTC 有+06:00 偏移量的区域中。

您的解释与上述案例不同。在您的情况下,您将 08:30 解释为与 UTC 同步的时间,然后连接所需区域的时区偏移字符串。

因此,如果您真的想这样做,请三思。


实现这一点的一种方法是简单地将日期时间解析为偏移日期时间并否定偏移量。

【讨论】:

  • 我脑子里真的有一个错误的循环来思考这个问题。 cmets和您的回答对我帮助很大。我现在必须重新考虑我的决定,并知道如何实施。
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 2022-06-27
  • 1970-01-01
  • 2012-05-01
  • 2016-04-10
  • 2012-08-02
  • 1970-01-01
相关资源
最近更新 更多