2017-03-01 324 views
0

我正在處理需要將UTC時間戳轉換爲其他區域特定時間戳的要求。下面是不同時區的列表。將UTC時間戳轉換爲其他時區特定時間

CET UTC+0100 
CST UTC+0800 
CST UTC-0600 
EST UTC-0500 
IST UTC+0530 
MET-1METDST 
SGT UTC+0800 
SST-8 


public static String convertUTCTimeStampToOtherZoneTimestamp(Timestamp timestamp,String timeZone){ 
    String zoneSpecificTimeStamp=""; 
    try { 
     DateFormat gmtFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     TimeZone zoneTime = TimeZone.getTimeZone(timeZone); 
     gmtFormat.setTimeZone(zoneTime); 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     String inputDateString = sdf.format(timestamp); 
     sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
     zoneSpecificTimeStamp=gmtFormat.format(sdf.parse(inputDateString)); 
     } catch (ParseException e) { 
     e.printStackTrace(); 
     return zoneSpecificTimeStamp; 

     } 
    return zoneSpecificTimeStamp; 
} 

上面的代碼是一樣EST,PST,IST時區,但在列表中的程序給錯誤的結果中提到的其他時區做工精細。請更新我的正確解決方案

+1

這已被問了很多次。請先搜索。提示:您應該使用時區名稱,如「Europe/Paris」,而不是「CET」。 –

+0

他其實是對的,同一地理位置在夏季和冬季有不同的時區。 – hoaz

+0

如果您使用的是java 8,請嘗試使用zoneddate時間https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html – Maverick

回答

2

您應該只使用全名或帶偏移量的GMT。

ID - TimeZone的ID,例如「PST」的縮寫,諸如「America/Los_Angeles」的全名或諸如「GMT-8:00」的自定義ID。請注意,縮寫的支持僅適用於JDK 1.1.x兼容性,應使用全名。

https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html#getTimeZone-java.lang.String-


對於您所提供的所有時區,因此你可以傳遞給方法有兩種方式。

GMT OFFSET

只是把這個字符串作爲"GMT {offset}"例子:

"GMT+0800",而不是"CCST UTC+0800"

"GMT-0600"而不是"CST UTC-0600"

等等

縮寫(不推薦)

或者只是傳遞的縮寫,你還可以:

"CST",而不是"CST UTC+0800"

"EST而不是"EST UTC-0500"

注意

雖然在你的前綴中使用的縮寫大量似乎工作,文檔說明使用全名,因爲縮寫只是爲了兼容性。

+0

感謝您的建議。格林尼治標準時間偏移正在工作,但如何處理這兩個時區。 MET1METDST SST-8 –

+0

只需使用SST,MET等您需要傳遞實際縮寫,否則使用GMT傳遞偏移量 –

+1

來自文檔的引用說只能使用全名。然後你會說可以使用縮寫。不是。只有一些工作,他們只是出於向後兼容的目的。 –