TimeZone.setTimeZone(“est”)与TimeZone.setTimeZone(“EST”)不同

时间:2012-11-05 11:14:08

标签: java calendar

当我写这段代码时:

   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.

注意:我尝试使用ISTist字符串。对于IST字符串,它为Indian Standard Time而对于ist,则为Greenwich Mean Time

2 个答案:

答案 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的时区,从而为您提供默认结果

它适用于estGMT-05:00EASTERN STANDARD TIME),当然因为这两个ID都是已知的,但我不会指望它(不太确定它是否仍会存在改变平台)。

此外,正如API所述,您不应使用这些缩写ID,而应直接使用全名或自定义ID。

您可以使用TimeZone.getAvailableIDs()列出平台的可用ID列表,然后选择正确的ID。

我自己会考虑使用GMT-5:00格式,这在我看来更具可读性且不易出错。