3

当我写这段代码时:

   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

在设置时给出像“EST”和“est”这样的参数有什么区别TimeZone.setTimeZone(String str)str在调用被认为是CASE SENSITIVE时要传递)?

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

4

2 回答 2

3

简而言之,是的,它区分大小写。

按照您的示例ist为您提供,GMT因为找不到具有此类 ID 的时区,因此为您提供默认结果

它与est( GMT-05:00is EASTERN STANDARD TIME) 一起使用,肯定是因为这两个 ID 都是已知的,但我不会指望它(不太确定如果更改平台它是否仍然存在)。

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

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

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

于 2012-11-05T11:59:09.643 回答
3

getTimeZone(String id) 的实现实际上从 JDK 7 更改为 8。

在 JDK 7 中,“est”实际上是返回一个 id 为“est”的时区。在 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());
}
于 2015-05-08T21:28:21.687 回答