我想获得 TimeZones ,我可以在设置中看到: 日期和时间 -->
是的,我知道,在 java/android 中可以通过 TimeZone.getAvailableIDs()
获取所有时区,但我只想获取时区,存在于
.
最佳答案
正如您所注意到的,可以通过调用 TimeZone
来获取设备上所有可用 TimeZone.getAvailableIDs()
的列表,但是,这通常会返回一个包含 500 多个 TimeZone
的列表,其中 displayName
并不总是用户友好(如 GMT+05:00
) .
所以现在,如果你看一下 Android 的时区列表,它只包含大约 80 个元素,具有格式良好的名称等等。
通过查看源代码(直到Kitkat),您可以看到他们实际上是从位于 /res/xml/timezones.xml
的xml中检索时区的。
每行定义如下:<timezone id="America/New_York">Eastern Time</timezone>
所以他们所做的是解析整个 timezones.xml
文件和 put the (Olson) id
and text
in a List of Timezone Map
。
public static SimpleAdapter constructTimezoneAdapter(Context context,
boolean sortedByName, int layoutId) {
final String[] from = new String[] {ZoneGetter.KEY_DISPLAYNAME, ZoneGetter.KEY_GMT};
final int[] to = new int[] {android.R.id.text1, android.R.id.text2};
final String sortKey = (sortedByName ? ZoneGetter.KEY_DISPLAYNAME : ZoneGetter.KEY_OFFSET);
final MyComparator comparator = new MyComparator(sortKey);
final List<Map<String, Object>> sortedList = ZoneGetter.getZonesList(context);
Collections.sort(sortedList, comparator);
final SimpleAdapter adapter = new SimpleAdapter(context,
sortedList,
layoutId,
from,
to);
return adapter;
}
接下来,对于该列表中的每个时区
Map
,他们通过 TimeZone
检索关联的 TimeZone.getTimeZone(String id)
并将关联的 offset
和 GMT
添加到其中。因此,最后,它们真正显示的是时区列表,它们从文件中检索ID:
timezones.xml
。如果每个时区有一个 id,那么可以使用的方法是仅组成一个 Olson id 列表并显示它们的
displayName
。如果您有更多,这可能不起作用,因为一些 Olson id 持有与其他 ID 相同的
displayName
,例如: Europe/Amsterdam
和 Europe/Brussels
都指代 European Central Time
。注意:这篇文章主要针对 Kit Kat,可能不适用于低/高版本。如果你想获得更多关于你自己版本的信息,请引用:this link
关于android - 我如何获得可用的时区(android :settings),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14059007/