当我写这段代码时:
Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("EST"));
System.out.println(cal.getTimeZone().getDisplayName());
输出
Eastern Standard Time
但是当我写这段代码时:
Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("est"));
System.out.println(cal.getTimeZone().getDisplayName());
我得到的输出是:
GMT-05:00
在设置TimeZone.setTimeZone(String str)
时调用“EST”和“est”等参数有什么不同(在调用CASE SENSITIVE时传递str
)?
API没有提及任何相关内容:
getTimeZone
public static TimeZone getTimeZone(String ID)
Gets the TimeZone for the given ID.
Parameters:
ID - the ID for a TimeZone, either an abbreviation such as "PST", a full name such as "America/Los_Angeles", or a custom ID such as "GMT-8:00".
Note that the support of abbreviations is for JDK 1.1.x compatibility only and full names should be used.
Returns:
the specified TimeZone, or the GMT zone if the given ID cannot be understood.
注意:我尝试使用IST
和ist
字符串。对于IST
字符串,它为Indian Standard Time
而对于ist
,则为Greenwich Mean Time
答案 0 :(得分:3)
getTimeZone(String id)的实现实际上已从JDK 7更改为8。
在JDK 7中,“est”实际上返回一个id为“est”的timeZone。在java 7上运行以下测试用例将成功(并在java 8上失败):
@Test
public void estTimeZoneJava7() {
TimeZone timeZone = TimeZone.getTimeZone("est");
assertEquals("est", timeZone.getID()) ;
}
使用Java 8时区“est”实际上作为未知时区处理,实际上将返回ID为“GMT”的GMT时区。以下测试用例将在Java 8上成功(并在java 7上失败)。
@Test
public void estTimeZoneJava8() {
TimeZone timeZone = TimeZone.getTimeZone("est");
assertEquals("GMT", timeZone.getID());
}
答案 1 :(得分:2)
简而言之,是的,它区分大小写。
根据您的示例ist
为您提供GMT
,因为无法找到具有此类ID的时区,从而为您提供默认结果
它适用于est
(GMT-05:00
是EASTERN STANDARD TIME
),当然因为这两个ID都是已知的,但我不会指望它(不太确定它是否仍会存在改变平台)。
此外,正如API所述,您不应使用这些缩写ID,而应直接使用全名或自定义ID。
您可以使用TimeZone.getAvailableIDs()
列出平台的可用ID列表,然后选择正确的ID。
我自己会考虑使用GMT-5:00
格式,这在我看来更具可读性且不易出错。