2015-10-28 35 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位数字表示不同的,所以这将没有解决问题。