2010-02-03 52 views

回答

2

請參閱java.util.TimeZone中的String getDisplayName(boolean daylight,int style)方法。樣式可以是TimeZone.LONGTimeZone.SHORT,短樣式返回時區的短名稱。


更長卷繞的方法是檢查String[] TimeZone.getAvailableIDs(int offset)輸出。短時區代碼可能是不明確的或多餘的,所以也許你可能想更深入的瞭解吧:

TimeZone tz = TimeZone.getTimeZone("Europe/London"); 
for (String s : TimeZone.getAvailableIDs(tz.getOffset(System.currentTimeMillis()))) { 
    System.out.print(s + ","); 
} 

------------------------------------------------------ 

Africa/Abidjan,Africa/Accra,Africa/Bamako,Africa/Banjul,Africa/Bissau, 
Africa/Casablanca,Africa/Conakry,Africa/Dakar,Africa/El_Aaiun,Africa/Freetown, 
Africa/Lome,Africa/Monrovia,Africa/Nouakchott,Africa/Ouagadougou,Africa/Sao_Tome, 
Africa/Timbuktu,America/Danmarkshavn,Atlantic/Canary,Atlantic/Faeroe, 
Atlantic/Faroe,Atlantic/Madeira,Atlantic/Reykjavik,Atlantic/St_Helena, 
Eire,Etc/GMT,Etc/GMT+0,Etc/GMT-0,Etc/GMT0,Etc/Greenwich,Etc/UCT, 
Etc/UTC,Etc/Universal,Etc/Zulu,Europe/Belfast, 
Europe/Dublin,Europe/Guernsey,Europe/Isle_of_Man,Europe/Jersey,Europe/Lisbon, 
Europe/London,GB,GB-Eire,GMT,GMT0,Greenwich,Iceland,Portugal,UCT,UTC, 
Universal,WET,Zulu, 
+0

這將返回「MESZ」爲「歐洲/倫敦」 – nr1 2010-02-03 18:08:53

+0

好奇。當輸入是「MESZ」時,長輸出是「格林威治標準時間」。 – mob 2010-02-03 19:12:52

+1

MitteleuropäischeSommerzeit。 – trashgod 2010-02-04 00:48:54

0

您可以使用下面的代碼來找到任何時區3位數的縮寫。

Date date = new Date(); 

String TimeZoneIds[] = TimeZone.getAvailableIDs(); 

String timezoneShortName = ""; 

String timezoneLongName = "Europe/London"; 

for (int i = 0; i < TimeZoneIds.length; i++) { 
    TimeZone tz = TimeZone.getTimeZone(TimeZoneIds[i]); 
    String tzName = tz.getDisplayName(tz.inDaylightTime(date),TimeZone.SHORT); 

    if(timezoneLongName.equals(TimeZoneIds[i])){ 
     timezoneShortName = tzName; 
     break; 
    } 
} 
System.out.println(timezoneShortName); 
+0

雖然這裏的問題是,當你這樣做:'日期日期=新的日期();',這是應用你在任何設備的時區。所以當你執行'tz.inDaylightTime(date)'時,這只是確定你當前的設備是否在夏令時,而不是在夏季時間是否在**「Europe/London 「**。例如,如果我在紐約的PC上運行此代碼並將我的PC時區設置爲EDT,那麼此代碼將確定紐約的DST狀態,而不是「歐洲/倫敦」......有關如何解決這個問題!?! – johnvdenley 2013-01-13 14:38:35

+0

@johnvdenley'Date'表示一個絕對時間點(自時代起,內部爲毫秒),所以這不是問題。換句話說,如果我在波士頓調用'new Date()',我的朋友在同一時刻在倫敦調用'new Date()',我們的'Date'對象將具有相同的基礎時間戳。 – augurar 2016-04-18 19:52:51

+0

當然,但這不是我想解決的問題。我的問題是日期存儲在服務器上(UTC),但當同一日期在客戶端PC上提供時,則客戶端PC正在應用本地時區,如果您需要相對時間,這很好。然而,這裏是我的產品的用例:週五下午4點,我在倫敦預約了一次頭髮預約,週一我去了紐約,我忘記了預約的時間,因此我登錄系統並在星期五晚上9點告訴我它!或者,服務器發送給我一個文本告訴我約會是在晚上8點(因爲服務器是UTC) – johnvdenley 2016-10-10 20:33:40