我如何获得可用的时区(android:settings)

Yur*_*rev 7 settings timezone android

我想获得TimeZones,我可以在设置中看到:日期和时间 - >

选择时区

是的,我知道,在java/android中可以获得所有时区TimeZone.getAvailableIDs(),但我想只获得时区,存在于

设置屏幕.

Sna*_*ker 7

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

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

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

所以他们做什么,是解析整个timezones.xml文件,并把(奥尔森)id,并text在时区的列表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;
    }
Run Code Online (Sandbox Code Playgroud)

接下来,对于Map该列表中的每个时区,他们检索相关的TimeZone感谢TimeZone.getTimeZone(String id)并添加相关的offsetGMT.

所以最后,它们显示的是一个时区列表,它们从文件中检索ID : timezones.xml.


如果每个时区有一个id,那么可能有用的东西就是组成一个Olson ID列表并显示它们displayName.如果你有更多,那可能不会起作用,因为一些Olson id displayName和其他的一样,如:Europe/AmsterdamEurope/Brussels两者都引用European Central Time.

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

  • 如果有人正在寻找 timezones.xml 的更新版本(在本例中为 android 9),文件的位置已更改:https://android.googlesource.com/platform/frameworks/base/+/android-9.0。 0_r33/packages/SettingsLib/res/xml/timezones.xml (2认同)

Quo*_*oon 5

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());
            }
        } 
Run Code Online (Sandbox Code Playgroud)

我认为这个对你有帮助


Yur*_*rev 1

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

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

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