2017-11-04 150 views
1

我寫一個輔助方法,該方法日期的字符串表示,並返回時區的java 8得到的時區zonedLocalTime

例如:

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」,但至少有一點是正確的。在這裏,我所得到的是完全錯誤的,那時在阿比讓和洛杉磯有很大的不同。

什麼是正確的方式來到這裏?

+0

在這個線程中出了點問題。當您可以使用現代Java日期和時間API(包括'ZonedDateTime')時,我堅信使用過時的'TimeZone'類也沒有意義。喜歡現代的'ZoneId'。它的靜態'getAvailableZoneIds'方法將爲您提供可用的時區。 –

回答

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 
+0

爲什麼是博伊西?我期望它是Los_Angeles。 –

+0

具有相同時區的區域列表按名稱排序,因此列表中的第一個是America/Boise。 – Aguid

1

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 
+0

這是錯誤的,因爲時區應該是Los_Angeles。即PST,但是回收的是MST。通過的輸入是PST –

+0

由於您的日期只有偏移量,Java無法知道夏令時是否正在使用,因此它只是在不使用夏令時的情況下給出UTC-7時區。 –

+0

在Java中獲取Los_Angeles的時間將節省日光並在請求時給出正確的時間。這是我想拯救Los_Angeles而不是UTC-07:00的原因之一。我現在怎麼去轉換? –