7

I want to get TimeZones, that I can see in settings: Date and Time -->

Select time zone

Yes, I know, that in java/android can get all timezones by TimeZone.getAvailableIDs(), but I want get only timezones, that exists on

settings screen.

4

4 回答 4

10

正如您所注意到的,可以TimeZone通过调用来获取设备上所有可用的 s的列表TimeZone.getAvailableIDs(),但是,这通常会返回一个包含 500TimeZone多个 s 的列表,其中 adisplayName并不总是用户友好的(例如 a GMT+05:00)。

所以现在,如果你看一下 Android 的时区列表,它只包含大约 80 个元素,名称格式很好。通过查看源代码(直到 Kitkat),您可以看到它们实际上是从位于/res/xml/timezones.xml. 每行定义如下:

<timezone id="America/New_York">Eastern Time</timezone>

所以他们所做的是解析整个timezones.xml文件并将(Olson)idtextList of TimezoneMap

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 与displayName其他 ID 相同,例如:Europe/Amsterdam并且Europe/Brussels都指European Central Time.

注意:这篇文章主要关注 Kit Kat,可能不适用于低/高版本。如果您想获得更多关于您自己的版本的信息,请参考:此链接

于 2016-03-17T18:21:35.563 回答
4
String[]TZ = TimeZone.getAvailableIDs();
        ArrayList<String> TZ1 = new ArrayList<String>();
        for(int i = 0; i < TZ.length; i++) {
            if(!(TZ1.contains(TimeZone.getTimeZone(TZ[i]).getDisplayName()))) {
                TZ1.add(TimeZone.getTimeZone(TZ[i]).getDisplayName());
            }
        } 

我想这个对你有帮助

于 2012-12-27T18:57:43.300 回答
1

是的,我已经尝试选择一个偏移量 - 一个时区。但在这种情况下会出现另一个错误。我使用这个时区以编程方式将事件添加到谷歌日历(解析 ics 文件)。在某些时区我有问题。例如,我添加了时区 +6 GMT 的事件。

getAvailableIDs() 以这个偏移量返回某个第一个时区(我不完全记得,但时区是“.../Vostok”)。如果我尝试使用这个时区添加事件,那么我在 Google 日历 Android 应用程序中打开了这个添加的事件,然后看到,该时区设置不是正常的“美国/纽约”或“欧洲/莫斯科”,而只是“+ 6 GMT”。

所以我开始查看列表“标准”时区。现在我用了另一种方式。我在谷歌日历中搜索,发现他们没有在运行时使用一些 proc 获取时区,而只是在静态数组中设置了一些时区 ID。现在我也使用了这个列表。我不知道,这个列表是如何从 android 版本改变的。但在 4.x 和 2.x 上工作正常

于 2012-12-27T22:34:41.443 回答
0

一旦你调用了TimeZone.getAvailableIDs();,你就可以使用它TimeZone.getTimeZone(id)来获取一个TimeZone对象。使用此对象,您可以获得名称(使用.getDisplayName())或偏移量(使用.getRawOffset(),它返回毫秒偏移量)。

String[] timezones = TimeZone.getAvailableIDs();
for (String tzId : timezones) {
    TimeZone tz = TimeZone.getTimeZone(tzId);
    String name = tz.getDisplayName();
    int offset = tz.getRawOffset();
    // ...
}
于 2012-12-27T18:03:38.783 回答