从 JSON 字符串确定时区?

Determine TimeZone from a JSON String?

我正在查询 JSON API returns 类似这样的内容:

{
  "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 解析为 ZonedDateTime 以便将其转换为 UTC?

有一些选项。

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

    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 );

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

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

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

有哪些最佳选择?

  • 使用 Joda Time.
  • 使用Date Time 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);
    

希望对您有所帮助:)