java 8 从 zonedLocalTime 获取时区
java 8 getting timeZone from zonedLocalTime
我正在编写一个辅助方法,它采用字符串表示日期和 returns TimeZone
例如:
input: 2017-11-02T09:30:00-07:00
output : "America/Los_Angeles"
(此处输入为 PST。我使用的 UTC 偏移量为 -7:00)
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",但至少有一些是正确的。从某种意义上说,我得到的是完全错误的,阿比让和 Los_Angeles 的时间非常不同。
到达这里的正确方法是什么?
TimeZone.getAvailableIDs()
是一个 static 方法,只是 returns 每个区域的所有已知 ID。
您可以使用 TimeZone.getAvailableIDs(int rawOffset)
其中 returns 给定毫秒偏移的 ID。
以你的例子为例date/time
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
这是我的提议:
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
我正在编写一个辅助方法,它采用字符串表示日期和 returns TimeZone
例如:
input: 2017-11-02T09:30:00-07:00
output : "America/Los_Angeles"
(此处输入为 PST。我使用的 UTC 偏移量为 -7:00)
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",但至少有一些是正确的。从某种意义上说,我得到的是完全错误的,阿比让和 Los_Angeles 的时间非常不同。
到达这里的正确方法是什么?
TimeZone.getAvailableIDs()
是一个 static 方法,只是 returns 每个区域的所有已知 ID。
您可以使用 TimeZone.getAvailableIDs(int rawOffset)
其中 returns 给定毫秒偏移的 ID。
以你的例子为例date/time
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
这是我的提议:
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