将字符串转换为ZonedDateTime并更改TimeZone

时间:2019-04-09 15:04:06

标签: java datetime zoneddatetime

我有这个字符串db.getCollection('users').updateMany( { "Username" : "Pablo.Lobo@gmail.com", "Orders": { $elemMatch: { "PendingDetails.State": { $exists: true, $ne: null } } } }, { $set: { "Orders.$.PendingDetails.State" : "123" } } )

我想转换为"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(在GMT + 0300上,我认为DateTimeParseException: Text 'Tue Apr 09 2019 12:59:51 GMT+0300' could not be parsed at index 25是不正确的,但我不知道它是什么)

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

2 个答案:

答案 0 :(得分:5)

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

  

四个字母输出完整格式,即本地化的偏移文本,   例如“ GMT”,带有2位数的小时和分钟字段,可选秒   字段(如果非零)和冒号,例如'GMT + 08:00'。

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

答案 1 :(得分:2)

由于您的字符串包含偏移量且没有时区,因此您想要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 格式给出,例如亚洲/仰光。

修改

  

我使用ZonedDateTime是因为我在应用中使用时区。

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

    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 [欧洲/扎波罗热]

如果出于某种原因即使您不想将GMT + 0300都视为时区,那么我最初展示的解析也可以与ZonedDateTime一起使用:

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

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