3

我正在查询返回如下内容的 JSON API:

{
  "created_time": "2017-01-05T16:32:29+0100",
  "updated_time": "2017-01-11T09:38:41+0100",
  "id": "23842536731240607"
}

我需要以 UTC 格式存储时间,但为了更改时区,我首先需要将其解析为ZonedDateTime.

转换"+0100""+01:00"很容易。但是如何将 (created/updated)_time 解析为 aZonedDateTime以便将其转换为 UTC?

4

2 回答 2

4

有一些选择。

首先,正如您所说,在区域偏移中插入冒号并不难。完成后,获得 aZonedDateTime很简单:

    ZonedDateTime zdt = ZonedDateTime.parse("2017-01-11T09:38:41+01:00");
    System.out.println(zdt);

这打印:

2017-01-11T09:38:41+01:00

或者,有趣的是,虽然ZonedDateTime.parse(String)在偏移量中需要一个冒号,ZoneId.of()但不需要,因此您可以拆分偏移量并执行以下操作:

    ZoneId zi = ZoneId.of("+0100");
    LocalDateTime ldt = LocalDateTime.parse("2017-01-11T09:38:41");
    ZonedDateTime zdt = ldt.atZone(zi);

结果和以前一样。

如果您不想在解析之前修改您的字符串,还有:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
    ZonedDateTime zdt = ZonedDateTime.parse("2017-01-11T09:38:41+0100", dtf);

这也给出了相同的结果。

编辑:注意:我正在使用ZonedDateTime,因为你在你的问题中要求这个。您可能认为使用它更正确OffsetDateTime。大多数代码实际上是相同的。拆分偏移量的版本将如下所示:

    ZoneOffset zo = ZoneOffset.of("+0100");
    LocalDateTime ldt = LocalDateTime.parse("2017-01-11T09:38:41");
    OffsetDateTime odt = ldt.atOffset(zo);

如问题末尾所述,要转换为 UTC,ZoneOffset请应用另一个 常量ZoneOffset.UTC

OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );
于 2017-01-12T13:10:16.283 回答
0

好吧,让我分解问题陈述。

首先,如果您正在查询 API,那么可以假设它们遵循某种标准的日期时间格式(即使您正在创建一个)。查看给定的日期,它们看起来像是遵循 - ** ISO 8601 - 日期和时间格式 **

所以问题是如何解析ISO 8601 - 日期和时间格式

有哪些最佳选择?

  • 使用乔达时间
  • 使用日期时间 API Java-8

    //Joda
    String jtDate = "2010-01-01T12:00:00+01:00";
    DateTimeFormatter yoda = ISODateTimeFormat.dateTimeNoMillis();
    System.out.println(parser2.parseDateTime(jtDate));
    
    //using Java 8 (As you specified - To convert "+0100" to "+01:00"    is easy enough.)
    String strDate = "2017-01-05T16:32:29+01:00";
    DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME;
    TemporalAccessor convertMe = timeFormatter.parse(strDate);
    Date date = Date.from(Instant.from(convertMe));
    System.out.println(date);
    

希望能帮助到你 :)

于 2017-01-12T13:51:32.353 回答