【发布时间】:2019-11-02 08:54:13
【问题描述】:
作为 Java 方法的输入,我得到了 ISO8601 日期时间格式的日期时间和州名(美国州名,如 TX、Chicago 等)。 我需要将日期时间转换为州名称本地的日期时间。 例如 - 2019-09-13T10:26:00-05:00 是我的日期时间值并将州名称设为 Los Angeles ,然后我必须将日期时间转换为洛杉矶日期时间。如何在 Java 中做到这一点? 请帮忙
【问题讨论】:
作为 Java 方法的输入,我得到了 ISO8601 日期时间格式的日期时间和州名(美国州名,如 TX、Chicago 等)。 我需要将日期时间转换为州名称本地的日期时间。 例如 - 2019-09-13T10:26:00-05:00 是我的日期时间值并将州名称设为 Los Angeles ,然后我必须将日期时间转换为洛杉矶日期时间。如何在 Java 中做到这一点? 请帮忙
【问题讨论】:
将您的输入字符串解析为OffsetDateTime 对象。 java.time 类默认解析标准ISO 8601 格式的字符串。
OffsetDateTime odt = OffsetDateTime.parse( "2019-09-13T10:26:00-05:00" ) ;
odt.toString(): 2019-09-13T10:26-05:00
要调整为 UTC,请应用 UTC 常量。
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ) ;
odtUtc.toString(): 2019-09-13T15:26Z
或者提取Instant,因为Instant 根据定义始终是UTC。
Instant instant = odt.toInstant() ;
instant.toString(): 2019-09-13T15:26:00Z
确定您的时区。时区以Continent/Region 的格式命名。
命名一个州(例如美国的蒙大拿州或加利福尼亚州)是不够的。整个州甚至可能不在同一个时区。您需要在official list of time zones 中看到的大陆和地区名称。
顺便说一句,“洛杉矶”是一个城市,而不是一个州。但这恰好是美国西海岸大部分地区使用的时区名称。嗯,实际上,正式的时区名称是`America/Los_Angeles"。
互联网上的某个地方可能有一个资源可以维护城市到区域的映射,但我不知道有任何资源。如果您只期望一组特定的城市,您可以制作自己的地图。
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
应用到Instant 或OffsetDateTime 以获得ZonedDateTime 对象。
ZonedDateTime zdt = instant.atZone( z ) ;
zdt.toString(): 2019-09-13T08:26-07:00[美国/洛杉矶]
【讨论】: