使用java将日期转换为AEST

时间:2018-01-23 23:08:09

标签: java datetime datetime-parsing

我想使用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").toSt‌​ring().trim()); 
System.out.println(zdt);

这种模式有问题吗?请建议。

2 个答案:

答案 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接受的答案是一个很好的答案。由于我有时发现自己与这个问题有关(通常来自重复项),因此我想提供一个替代方法和一些其他信息。

我的假设

  • AEST不是一种格式。这是一个时区的缩写,虽然四个字母的时区缩写通常是模棱两可的,但我相信我们可以将AEST设为澳大利亚东部标准时间,这是标准时间在澳大利亚/悉尼时区中使用的时间(夏季所需的时间) (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 [澳大利亚/悉尼]

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

链接

相关问题