2010-02-03 167 views

回答

2

请参阅java.util.TimeZone中的String getDisplayName(boolean daylight,int style)方法。样式可以是TimeZone.LONGTimeZone.SHORT,短样式返回时区的短名称。


更长卷绕的方法是检查String[] TimeZone.getAvailableIDs(int offset)输出。短时区代码可能是不明确的或多余的,所以也许你可能想更深入的了解吧:

TimeZone tz = TimeZone.getTimeZone("Europe/London"); 
for (String s : TimeZone.getAvailableIDs(tz.getOffset(System.currentTimeMillis()))) { 
    System.out.print(s + ","); 
} 

------------------------------------------------------ 

Africa/Abidjan,Africa/Accra,Africa/Bamako,Africa/Banjul,Africa/Bissau, 
Africa/Casablanca,Africa/Conakry,Africa/Dakar,Africa/El_Aaiun,Africa/Freetown, 
Africa/Lome,Africa/Monrovia,Africa/Nouakchott,Africa/Ouagadougou,Africa/Sao_Tome, 
Africa/Timbuktu,America/Danmarkshavn,Atlantic/Canary,Atlantic/Faeroe, 
Atlantic/Faroe,Atlantic/Madeira,Atlantic/Reykjavik,Atlantic/St_Helena, 
Eire,Etc/GMT,Etc/GMT+0,Etc/GMT-0,Etc/GMT0,Etc/Greenwich,Etc/UCT, 
Etc/UTC,Etc/Universal,Etc/Zulu,Europe/Belfast, 
Europe/Dublin,Europe/Guernsey,Europe/Isle_of_Man,Europe/Jersey,Europe/Lisbon, 
Europe/London,GB,GB-Eire,GMT,GMT0,Greenwich,Iceland,Portugal,UCT,UTC, 
Universal,WET,Zulu, 
+0

这将返回“MESZ”为“欧洲/伦敦” – nr1 2010-02-03 18:08:53

+0

好奇。当输入是“MESZ”时,长输出是“格林威治标准时间”。 – mob 2010-02-03 19:12:52

+1

MitteleuropäischeSommerzeit。 – trashgod 2010-02-04 00:48:54

0

您可以使用下面的代码来找到任何时区3位数的缩写。

Date date = new Date(); 

String TimeZoneIds[] = TimeZone.getAvailableIDs(); 

String timezoneShortName = ""; 

String timezoneLongName = "Europe/London"; 

for (int i = 0; i < TimeZoneIds.length; i++) { 
    TimeZone tz = TimeZone.getTimeZone(TimeZoneIds[i]); 
    String tzName = tz.getDisplayName(tz.inDaylightTime(date),TimeZone.SHORT); 

    if(timezoneLongName.equals(TimeZoneIds[i])){ 
     timezoneShortName = tzName; 
     break; 
    } 
} 
System.out.println(timezoneShortName); 
+0

虽然这里的问题是,当你这样做:'日期日期=新的日期();',这是应用你在任何设备的时区。所以当你执行'tz.inDaylightTime(date)'时,这只是确定你当前的设备是否在夏令时,而不是在夏季时间是否在**“Europe/London “**。例如,如果我在纽约的PC上运行此代码并将我的PC时区设置为EDT,那么此代码将确定纽约的DST状态,而不是“欧洲/伦敦”......有关如何解决这个问题!?! – johnvdenley 2013-01-13 14:38:35

+0

@johnvdenley'Date'表示一个绝对时间点(自时代起,内部为毫秒),所以这不是问题。换句话说,如果我在波士顿调用'new Date()',我的朋友在同一时刻在伦敦调用'new Date()',我们的'Date'对象将具有相同的基础时间戳。 – augurar 2016-04-18 19:52:51

+0

当然,但这不是我想解决的问题。我的问题是日期存储在服务器上(UTC),但当同一日期在客户端PC上提供时,则客户端PC正在应用本地时区,如果您需要相对时间,这很好。然而,这里是我的产品的用例:周五下午4点,我在伦敦预约了一次头发预约,周一我去了纽约,我忘记了预约的时间,因此我登录系统并在星期五晚上9点告诉我它!或者,服务器发送给我一个文本告诉我约会是在晚上8点(因为服务器是UTC) – johnvdenley 2016-10-10 20:33:40