我有这个字符串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
是不正确的,但我不知道它是什么)
之后,我不知道如何更改时区。
答案 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