2015-10-28 33 views
1

我只從ihealth api獲取此字符串「+0800」作爲時區。我如何從這裏獲得相應的java時區id(如「US/Central」)。獲取java時區id從+0000格式

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("Z"); 

try { 
    Date date = sdf.parse("+0800"); 
    cal.setTime(date); 
    System.out.println(cal.getTimeZone().getID()); 
} catch (Exception e) { 
    System.out.println("error" + e.getMessage()); 
} 

但這總是打印不是「+0800」的「Etc/UTC」。我在這裏錯過了什麼?

+4

我的猜測(沒有嘗試過)會是日曆對象創建一個默認的時區,只是改變時間不會改變它的時區。但你對此有什麼期望?時區通常跨越多個國家,-0600可能是美國/某事,CA /某事,MX /某事......你永遠不會知道。 –

+2

「Date」對象沒有任何時區信息。您正在解析的時區僅用於計算日期值,之後將其丟棄。查看[TimeZone](http://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html)類的方法,或者如果您使用的是Java 8或更高版本,[ZoneId](http://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html)。 – VGR

回答

-4

試試這個:

Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat("Z"); 

    try { 
     Date date = sdf.parse("-0600"); 
     cal.setTime(date); 
     System.out.println(sdf.format(date)); 
    } catch (Exception e) { 
     System.out.println("error" + e.getMessage()); 
    } 
+0

這會再次輸出'+ 0800'。 –

+0

剛剛編輯答案:日期日期= sdf.parse(「 - 0600」); – Manitra

+0

他們爲什麼要這樣做?爲什麼這會解決他們的問題? –

5

有困難的是你問的是,有一個給定的偏移相關總是很多時區名(幾乎?)。因此,對於偏移 「+0800」 我們可以做

int rawOffset = 8 * 3600000; // +0800 hours converted to milliseconds 
String[] tzIds = java.util.TimeZone.getAvailableIDs(rawOffset); 
for (String id : tzIds) { 
    System.out.println(id); 
} 

,並在列表中看到

Antarctica/Casey 
Asia/Brunei 
Asia/Choibalsan 
Asia/Chongqing 
Asia/Chungking 
Asia/Harbin 
Asia/Hong_Kong 
Asia/Kashgar 
Asia/Krasnoyarsk 
Asia/Kuala_Lumpur 
Asia/Kuching 
Asia/Macao 
Asia/Macau 
Asia/Makassar 
Asia/Manila 
Asia/Shanghai 
Asia/Singapore 
Asia/Taipei 
Asia/Ujung_Pandang 
Asia/Ulaanbaatar 
Asia/Ulan_Bator 
Asia/Urumqi 
Australia/Perth 
Australia/West 
CTT 
Etc/GMT-8 
Hongkong 
PRC 
Singapore 

如果你想 「相應的Java時區ID」(重點煤礦),然後我想你必須選擇一個。 )

+0

考慮這種情況,對於印度斯坦塔特時間(IST),我得到「+0550」。爲什麼50比IST提前5小時30分鐘?如何將「+0550」(假設我有某種格式的日期和時間)轉換爲GMT或任何其他時區。或者如何將「+0550」轉換爲「+05:30」 – HeisenBerg

+0

其實我想要的是,我在「+0000」中獲得了unix時間戳格式和時區的時間。現在我該如何將其轉換爲GMT? – HeisenBerg

0

只要你使用Java 8可以使用ZoneOffset

例如

ZoneOffset zoneOffset = ZoneOffset.of("+0200"); 
TimeZone timezone = TimeZone.getTimeZone(zoneOffset)); 

編輯:ZoneOffset.of()接受offsetId,這是從4位數字表示不同的,所以這將沒有解決問題。