从 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.
-
//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);
希望对您有所帮助:)
我正在查询 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.
-
//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);
希望对您有所帮助:)