【问题标题】:Java.time from offset to timezone nameJava.time 从偏移量到时区名称
【发布时间】:2018-10-20 23:51:14
【问题描述】:

尝试将各种时间格式转换为统一格式。

一种格式是

"uuuu-MM-dd'T'HH:mm:ss-5000"

需要转换为时区格式:

"uuuu-MM-dd'T'HH:mm:ss EST"

使用以下代码,但它仅将时区指定为“-05:00”,而不是预期的“EST”。

    String targetFormat = "uuuu-MM-dd'T'HH:mm:ss z";
    String origFormat = "uuuu-MM-dd'T'HH:mm:ss.SSSZ";
    String origStr = "2018-02-05T17:25:18.156-0500";
    ZonedDateTime time = ZonedDateTime.parse(origStr, DateTimeFormatter.ofPattern(origFormat));
    String targetStr = time.format(DateTimeFormatter.ofPattern(targetFormat));

上面的输出是:

2018-02-05T17:25:18 -05:00

如何得到预期:

2018-02-05T17:25:18 EST

【问题讨论】:

    标签: java datetime-format java-time timezone-offset zoneddatetime


    【解决方案1】:

    -05:00 实际上不是时区。这只是一个偏移量:比 UTC 晚 5 小时,而且您无法真正将其映射到单个时区。

    在您使用的日期(2018 年 2 月 2 日),使用 -05:00* 的时区有 47 个,包括美国以外的地区 - 其中许多不将他们的时区称为“EST ”,例如使用“PET”(秘鲁时间)的利马或使用“COT”(哥伦比亚时间)的波哥大。无论每个地方使用的名称如何,它们都在您使用的日期和时间使用-05:00

    无论如何,当您解析-05:00 之类的偏移量时,由于上面列出的原因,API 无法知道您指的是哪个时区(不止一个,API 本身无法决定) .您必须任意选择一个时区,然后将解析的 ZonedDateTime 转换为该时区:

    ....
    ZonedDateTime time = ZonedDateTime.parse(origStr, DateTimeFormatter.ofPattern(origFormat));
    
    // convert to some arbitrary timezone
    time = time.withZoneSameInstant(ZoneId.of("America/New_York"));
    

    我选择“America/New_York”,因为它在 2018 年 2 月使用“EST”。这样,您的 targetStr 将是:

    2018-02-05T17:25:18 EST

    将时区名称更改为您想要的名称。请注意,对于 6 月的日期,当纽约实行夏令时时,它将返回“EDT”。


    *:我使用的是 JDK 8 和 2018e TZ 数据文件,所以这个数字可能因您的环境而异。

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 2016-05-07
      • 2020-04-20
      • 2014-02-15
      • 2021-04-11
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多