将 String 转换为 ZonedDateTime 并更改 TimeZone

Convert String to ZonedDateTime and change TimeZone

我有这个字符串"Tue Apr 09 2019 12:59:51 GMT+0300"

我想转换为 ZonedDateTime

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss OOOO");
ZonedDateTime zdt = ZonedDateTime.parse(a, dtf);

转换为ZonedDateTime后,我想将时区从GMT+0300更改为其他时区。

我的第一个问题是 parse。我得到:

DateTimeParseException: Text 'Tue Apr 09 2019 12:59:51 GMT+0300' could not be parsed at index 25(在GMT+0300,我觉得OOOO不对,但我不知道还有什么)

之后我不知道如何更改时区。

OOOO 期望分字段前有一个冒号,如 doc 所说:

Four letters outputs the full form, which is localized offset text, such as 'GMT, with 2-digit hour and minute field, optional second field if non-zero, and colon, for example 'GMT+08:00'.

您可以通过编程方式在最后一个 00 之前插入一个 :,然后对其进行解析。

由于您的字符串包含偏移量且没有时区,您要 ZonedDateTime 做什么? OffsetDateTime比较合适。

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern(
            "EEE MMM dd yyyy HH:mm:ss 'GMT'xx", Locale.ROOT);
    String a = "Tue Apr 09 2019 12:59:51 GMT+0300";
    System.out.println(OffsetDateTime.parse(a, dtf));

2019-04-09T12:59:51+03:00

时区是地球上的一个地方,包含该地方 UTC 偏移量的历史和已知未来变化。时区通常以 region/city 格式给出,例如 Asia/Rangoon.

编辑

I use ZonedDateTime because I use time zone in my app.

我不确定你的意思。也许您已经提前决定了您使用的是哪个时区?例如:

    ZoneId zone = ZoneId.of("Europe/Zaporozhye");
    OffsetDateTime odt = OffsetDateTime.parse(a, dtf);
    ZonedDateTime zdt = odt.atZoneSameInstant(zone);
    System.out.println(zdt);

2019-04-09T12:59:51+03:00[Europe/Zaporozhye]

如果出于某种原因您想将 GMT+0300 视为时区,即使它不是,我首先展示的解析也适用于 ZonedDateTime

    System.out.println(ZonedDateTime.parse(a, dtf));

2019-04-09T12:59:51+03:00