使用 java 将日期转换为 AEST
Convert date into AEST using java
我想使用 Java 将以下日期转换为 AEST 格式。
2018-01-08T02:10:24.000+0000w
下面是我用来转换的代码。
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);
模式有问题?请建议。
解析日期字符串时必须使用格式化程序。您还需要告诉它更改区域或区域偏移量以使其进入 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”,具体取决于一年中的不同时间。
@HankD 接受的答案很好。由于我发现自己有时 link 会回答这个问题(通常来自重复问题),所以我想提供一个替代方案和一些进一步的信息。
我的假设
- AEST 不是一种格式。它是一个时区缩写,虽然四个字母的时区缩写通常是模棱两可的,但我相信我们可以将 AEST 视为澳大利亚东部标准时间,标准时间期间 Australia/Sydney 时区使用的时间(你想要什么夏令时 (DST) 不是很清楚。
- 我假设您的日期和时间字符串的尾部
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[Australia/Sydney]
Pro:可能更清晰易读且不易出错。更灵活:接受秒的存在和不存在以及最多 9 位小数秒(或者如果您想要对字符串进行最严格的验证,您可能会认为这是一个缺点)。缺点:冗长。
2。写入格式模式字符串
构造格式化程序的另一种方法是另一个答案中也使用的方法:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
其余代码相同,输出也相同。亲:简短。缺点:更容易出错,阅读起来更不直接。不灵活:秒需要三位小数。
顺便说一句,虽然 java.time 的 类 通常在没有任何显式格式化程序的情况下解析最常见的 ISO 8601 格式变体,但偏移量中没有冒号的变体( +0000
而不是 +00:00
) 是最突出的例外。因此,鉴于我们不想手动操作输入字符串,以所示的两种方式之一构建自定义格式化程序是我们最好的选择。
模式有问题吗?
是的,使用 zzz
无法解析偏移量。根据文档(link 在底部),小写 z
用于时区名称,例如澳大利亚东部标准时间或 AEST。对于像 +0000
这样的偏移量,您需要大写 X
、小写 x
或大写 Z
.
链接
我想使用 Java 将以下日期转换为 AEST 格式。
2018-01-08T02:10:24.000+0000w
下面是我用来转换的代码。
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);
模式有问题?请建议。
解析日期字符串时必须使用格式化程序。您还需要告诉它更改区域或区域偏移量以使其进入 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”,具体取决于一年中的不同时间。
@HankD 接受的答案很好。由于我发现自己有时 link 会回答这个问题(通常来自重复问题),所以我想提供一个替代方案和一些进一步的信息。
我的假设
- AEST 不是一种格式。它是一个时区缩写,虽然四个字母的时区缩写通常是模棱两可的,但我相信我们可以将 AEST 视为澳大利亚东部标准时间,标准时间期间 Australia/Sydney 时区使用的时间(你想要什么夏令时 (DST) 不是很清楚。
- 我假设您的日期和时间字符串的尾部
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[Australia/Sydney]
Pro:可能更清晰易读且不易出错。更灵活:接受秒的存在和不存在以及最多 9 位小数秒(或者如果您想要对字符串进行最严格的验证,您可能会认为这是一个缺点)。缺点:冗长。
2。写入格式模式字符串
构造格式化程序的另一种方法是另一个答案中也使用的方法:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
其余代码相同,输出也相同。亲:简短。缺点:更容易出错,阅读起来更不直接。不灵活:秒需要三位小数。
顺便说一句,虽然 java.time 的 类 通常在没有任何显式格式化程序的情况下解析最常见的 ISO 8601 格式变体,但偏移量中没有冒号的变体( +0000
而不是 +00:00
) 是最突出的例外。因此,鉴于我们不想手动操作输入字符串,以所示的两种方式之一构建自定义格式化程序是我们最好的选择。
模式有问题吗?
是的,使用 zzz
无法解析偏移量。根据文档(link 在底部),小写 z
用于时区名称,例如澳大利亚东部标准时间或 AEST。对于像 +0000
这样的偏移量,您需要大写 X
、小写 x
或大写 Z
.