【问题标题】:java 8 getting timeZone from zonedLocalTimejava 8 从 zonedLocalTime 获取 timeZone
【发布时间】:2018-04-16 21:53:21
【问题描述】:

我正在编写一个辅助方法,它采用字符串表示日期并返回 TimeZone

例如:

input: 2017-11-02T09:30:00-07:00
output : "America/Los_Angeles"

(这里的输入是 PST。我使用的是 -7:00 的 UTC 偏移量)

Here is my method
 public static String getTimeZone(final String date) {
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, DateTimeFormatter.ISO_DATE_TIME);

        String timezone = TimeZone.getTimeZone(zonedDateTime.getZone()).getAvailableIDs()[0];
        System.out.println(timezone);
        return timezone;
    }

当我输入上述日期时,我得到Africa/Abidjan,这是完全不正确的。

我更喜欢“America/Los_Angeles”,但至少是正确的。从某种意义上说,我在这里得到的完全错误,在阿比让和洛杉矶的时间非常不同。

到达这里的正确方法是什么?

【问题讨论】:

  • 这个线程出了点问题。当您可以使用现代 Java 日期和时间 API(包括 ZonedDateTime)时,我坚信也使用过时的 TimeZone 类是没有意义的。更喜欢现代的ZoneId。它的静态getAvailableZoneIds 方法将为您提供可用的时区。

标签: date datetime java-8 localdate zoneddatetime


【解决方案1】:

这是我的提议:

public static String getTimeZone(final String date) {
    final ZonedDateTime zonedDateTime = ZonedDateTime.parse(date,DateTimeFormatter.ISO_DATE_TIME);
    final TimeZone timeZone = TimeZone.getTimeZone(zonedDateTime.getZone());
    return  Arrays.stream(TimeZone.getAvailableIDs(timeZone.getRawOffset())).peek(System.out::println).findFirst().get();
}

这里是输出

//America/Boise

【讨论】:

  • 为什么是博伊西?我希望它是 Los_Angeles。
  • 相同时区的区域列表是按名称排序的,所以列表中的第一个是 America/Boise。
【解决方案2】:

TimeZone.getAvailableIDs() 是一个静态方法,只返回每个区域的所有已知 id。

您可以使用 TimeZone.getAvailableIDs(int rawOffset) 返回给定毫秒偏移量的 id。

对于您的示例日期/时间

TimeZone tz = TimeZone.getTimeZone(zonedDateTime.getZone());
for (final String id : TimeZone.getAvailableIDs(tz.getRawOffset())) {
  System.out.println("id " + id);
}

给予:

id America/Boise
id America/Cambridge_Bay
id America/Chihuahua
id America/Creston
id America/Dawson_Creek
id America/Denver
id America/Edmonton
id America/Fort_Nelson
id America/Hermosillo
id America/Inuvik
id America/Mazatlan
id America/Ojinaga
id America/Phoenix
id America/Shiprock
id America/Yellowknife
id Canada/Mountain
id Etc/GMT+7
id MST
id MST7MDT
id Mexico/BajaSur
id Navajo
id PNT
id SystemV/MST7
id SystemV/MST7MDT
id US/Arizona
id US/Mountain

【讨论】:

  • 这是错误的,因为时区应该是洛杉矶。即 PST,但检索的是 MST。传递的输入是 PST
  • 由于您的日期只有一个偏移量,Java 无法知道是否正在使用夏令时,所以它只是给出没有夏令时的 UTC-7 时区。
  • 在 Java 中获取 Los_Angeles 的时间将考虑夏令时并在请求时提供正确的时间。这就是我想保存 Los_Angeles 而不是 UTC-07:00 的原因之一。我现在该如何转换?
猜你喜欢
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2017-11-18
  • 2018-07-02
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多