我想使用Java将以下日期转换为AEST格式。
2018-01-08T02:10:24.000 +0000瓦特
以下是我用来转换的代码。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSzzz");
ZonedDateTime zdt = ZonedDateTime.parse(
map.get("records-LastModifiedDate").toString().trim());
System.out.println(zdt);
这种模式有问题吗?请建议。
答案 0 :(得分:4)
解析日期字符串时必须使用格式化程序。您还需要告诉它更改区域或区域偏移量以使其进入AEST / AEDT。
这可能有效:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXX");
ZonedDateTime zdt = OffsetDateTime.parse(input, dtf)
.atZoneSameInstant(ZoneId.of("Australia/Sydney"));
String dateInTimeZone = zdt.format(dtf);
根据一年中的时间,偏移量将显示为“+1000”或“+1100”。
答案 1 :(得分:0)
@HankD接受的答案是一个很好的答案。由于我有时发现自己与这个问题有关(通常来自重复项),因此我想提供一个替代方法和一些其他信息。
w
是一个错字。没有它,您的格式将成为ISO 8601,这在世界范围内都是有意义的。我从未在其他地方的日期时间字符串中看到过这样的w
。为了完整起见,我想介绍两种方法,您可以构建一个可以解析字符串的格式化程序,每种方法都有其优缺点。
1。重用内置功能
String lastModifiedString = "2018-01-08T02:10:24.000+0000";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral('T')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.appendOffset("+HHmm", "Z")
.toFormatter();
OffsetDateTime odt = OffsetDateTime.parse(lastModifiedString, formatter);
ZonedDateTime zdt = odt.atZoneSameInstant(ZoneId.of("Australia/Sydney"));
System.out.println(zdt);
输出:
2018-01-08T13:10:24 + 11:00 [澳大利亚/悉尼]
Pro:可能更清晰易读,并且不太容易出错。更加灵活:接受秒的存在和不存在以及最多9位小数秒的小数(或者,如果您想对字符串进行尽可能严格的验证,则可能会认为这是不利的)。骗子。
2。编写格式模式字符串
构造格式化程序的另一种方法是在另一个答案中使用的一种方法:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
其余代码相同,输出也相同。优点:简短。缺点:更容易出错,读取也不太直接。不灵活:秒要求精确到小数点后三位。
顺便说一句,尽管java.time类通常在没有任何显式格式化程序的情况下解析最常见的ISO 8601格式变量,但该变量在偏移量中没有冒号(+0000
而不是{{1} })是最突出的例外。因此,鉴于我们不想手动操作输入字符串,最好用所示的两种方式之一构造自定义格式器。
是的,使用+00:00
不能解析偏移量。根据文档(底部的链接),小写zzz
用于时区名称,例如澳大利亚东部标准时间或AEST。对于z
这样的偏移量,您需要大写+0000
,小写X
或大写x
。