我想获得 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) 并将关联的 offsetGMT 添加到其中。

因此,最后,它们真正显示的是时区列表,它们从文件中检索ID:timezones.xml

如果每个时区有一个 id,那么可以使用的方法是仅组成一个 Olson id 列表并显示它们的 displayName
如果您有更多,这可能不起作用,因为一些 Olson id 持有与其他 ID 相同的 displayName,例如: Europe/AmsterdamEurope/Brussels 都指代 European Central Time

注意:这篇文章主要针对 Kit Kat,可能不适用于低/高版本。如果你想获得更多关于你自己版本的信息,请引用:this link

关于android - 我如何获得可用的时区(android :settings),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14059007/

10-12 21:29