使用 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").toSt‌​ring().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.

链接