2017-03-01 318 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

来自文档的引用说只能使用全名。然后你会说可以使用缩写。不是。只有一些工作,他们只是出于向后兼容的目的。 –