如何在Android中获取时区名称

11
我想在我的Android程序中显示时区的“名称”。例如,如果是“GMT+8:00”,则显示“香港”;通过搜索,我发现getDisplayName函数应该满足我的目的。
但是,在我的程序中,此函数只显示“GMT+8:00”,但当我在Google开源项目中使用“getDisplayName”时,它会显示名称“HongKong”。
有人知道背后的原因吗? http://developer.android.com/reference/java/util/TimeZone.html#getDisplayName(boolean, int, java.util.Locale)

我猜这是因为时区有许多名称,包括仅偏移量。UTC+8实际上是世界上人口最多的时区,因此它有特别多的名称,如WST、IRKT、Australia/Perth和Asia/Singapore。您需要找到TimeZone(可能还有SimpleTimeZone)的子类,以显示您想要的名称。 - Michael Scheper
3个回答

13

由你决定!你可以使用 Locale.getDefault() 或一个 Calendar 实例。

Locale.getDefault() 不是 TimeZone,而是指定设备上的语言。

  • Calendar calendar = Calendar.getInstance();
  • Locale.getDefault()

下面是一些示例:

打印 Log.d(LOG_TAG, String.valueOf(TimeZone.getDefault())); 显示:

D/MyActivity: libcore.util.ZoneInfo[id="Brazil/East",mRawOffset=-10800000,mEarliestRawOffset=-10800000,mUseDst=true,mDstSavings=3600000,transitions=128]

运行 Log.d(LOG_TAG, TimeZone.getDefault().getID()); 显示:

D/MyActivity: Brazil/East

.

运行 Log.d(LOG_TAG, String.valueOf(Locale.getDefault())); 显示:

D/MyActivity: fr_FR

.

运行 Log.d(LOG_TAG, String.valueOf(calendar.getTimeZone())); 显示:

D/MyActivity: libcore.util.ZoneInfo[id="Brazil/East",mRawOffset=-10800000,mEarliestRawOffset=-10800000,mUseDst=true,mDstSavings=3600000,transitions=128]

.

使用 Log.d(LOG_TAG, calendar.getTimeZone().getDisplayName()); 打印,结果为:

D/MyActivity: heure normale de Brasilia

.

不带语言环境和时区缩写打印时区名称:

Log.d(LOG_TAG, calendar.getTimeZone().getDisplayName(false, TimeZone.SHORT));

输出结果为:

D/MyActivity: GMT-03:00

.

不带语言环境和时区缩写打印时区全称:

Log.d(LOG_TAG, calendar.getTimeZone().getDisplayName(false, TimeZone.LONG));

输出结果为:

D/MyActivity: heure normale de Brasilia

.

查看你使用的方法的 Javadoc:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#getInstance(java.util.Locale)

使用默认时区和指定的语言环境获取日历。

阅读以下评论以更清楚地理解:

.


7
您可以通过以下代码查找您当前的时区。
private String getTimeZone() {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        TimeZone zone = calendar.getTimeZone();
        return zone.getID();
}

3

试试这个

TimeZone tz = TimeZone.getDefault();
System.out.println(tz.getID());

getDisplayName 返回时区信息,getId 返回时区位置名称。


我试过了。但是这显示的是“亚洲/香港”,而不是确切的位置名称。不过感谢你的建议,它更接近于我想要的展示方式。 - Antoine Murion
Asia/Hong_Kong 是该时区的标识符。您期望得到什么?您确定您需要的是时区名称,而不仅仅是位置吗?香港可能是一个大城市,但它只是一个非常人口稠密的时区中的一个城市。 - Michael Scheper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接