【问题标题】:How to convert date string in EDT to UTC date?如何将 EDT 中的日期字符串转换为 UTC 日期?
【发布时间】:2022-11-15 05:20:21
【问题描述】:

我正在从上游系统读取数据,它以这样的字符串格式返回日期,

String dateFromUpstream = 11-14-2022 10:41:12 EDT

现在,我想将此字符串转换为 UTC 时区的日期格式,然后将其存储到我的实体中。

我尝试了以下方式,

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy HH:mm:ss z");
LocalDateTime date = ZonedDateTime.parse(dateFromUpstream, formatter).toLocalDateTime().atZone(ZoneId.of("UTC"));

但这不会将日期更改为 UTC 时区。它仍然在字符串末尾为我提供与 UTC 而不是 EDT 相同的日期。

任何人都知道我该怎么做然后存储到一个实体中?

【问题讨论】:

  • LocalDateTime 是要转换成的错误类型。转换为 Instant
  • 我不能使用 localdatetime 吗?我想将此值存储到一个实体中,然后我使用此值与来自实体的另一个日期时间值进行比较,该实体具有 UTC 格式的日期时间。
  • LocalDateTime代表民用时间没有时区,例如“1 月 3 日,下午 5:25”。它可能意味着物理时间中的许多不同的实际瞬间。 LocalDateTime 甚至没有像 UTC 这样的时区。

标签: java


【解决方案1】:

使用 ZonedDateTime#withZoneSameInstant 将给定的日期时间字符串解析为 ZonedDateTime 和对应的 DateTimeFormatter,然后将生成的 ZonedDateTime 转换为 Instant 或另一个对应于 UTC 的 ZonedDateTime

演示:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String dateFromUpstream = "11-14-2022 10:41:12 EDT";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-uuuu HH:mm:ss z", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(dateFromUpstream, dtf);
        Instant instant = zdt.toInstant();
        System.out.println(instant);

        // Or get a ZonedDateTime at UTC
        ZonedDateTime zdtUTC = zdt.withZoneSameInstant(ZoneOffset.UTC);
        System.out.println(zdtUTC);

        // If you want LocalDateTime
        LocalDateTime ldt = zdtUTC.toLocalDateTime();
        System.out.println(ldt);
    }
}

输出:

2022-11-14T15:41:12Z
2022-11-14T15:41:12Z
2022-11-14T15:41:12

从以下位置了解有关现代日期时间 API 的更多信息Trail: Date Time.

【讨论】:

  • 如何将此 Instant 值与 LocalDateTime 格式的值进行比较?
  • @Lewis12 - 我已经更新了答案以演示如何从中获取 LocalDateTime。我希望它能满足你的要求。
  • 好答案。我会将 ZonedDateTime zdtUTC 更改为 OffsetDateTime odtUTC,因为您正在调整偏移量而不是时区。最终结果相同,但意图会更明确。
  • 我无法访问withZoneSameInstant。我只看到这两个,with(TemporalAdjuster adjuster)with(TemporalField field, long newValue)。难道我做错了什么?
猜你喜欢
  • 2021-04-19
  • 2022-01-11
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
相关资源
最近更新 更多