我只是从ihealth api的时区获取此字符串“ +0800”。如何从中获取相应的Java时区ID(例如“ US / Central”)。

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());
}


但这总是打印“ Etc / UTC”,而不是“ +0800”。我在这里想念什么?

最佳答案

您要问的困难是(几乎?)总是有许多与给定偏移量关联的时区名称。因此,对于“ +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”(重点是我的),那么我想您必须选择一个。 ;)

10-07 13:41