【问题标题】:convert ISO8601 date time to another ISO8601 format based on State name in Java?基于Java中的状态名称将ISO8601日期时间转换为另一种ISO8601格式?
【发布时间】:2019-11-02 08:54:13
【问题描述】:

作为 Java 方法的输入,我得到了 ISO8601 日期时间格式的日期时间和州名(美国州名,如 TX、Chicago 等)。 我需要将日期时间转换为州名称本地的日期时间。 例如 - 2019-09-13T10:26:00-05:00 是我的日期时间值并将州名称设为 Los Angeles ,然后我必须将日期时间转换为洛杉矶日期时间。如何在 Java 中做到这一点? 请帮忙

【问题讨论】:

    标签: java datetime


    【解决方案1】:

    将您的输入字符串解析为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[美国/洛杉矶]

    看到这个code run live at IdeOne.com。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2015-01-20
      • 2012-08-25
      • 1970-01-01
      相关资源
      最近更新 更多