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

时间:2012-12-27 17:56:19

标签: android timezone settings

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

Select time zone

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

settings screen

4 个答案:

答案 0 :(得分:7)

正如您所注意到的,可以通过调用TimeZone来获取设备上可用的所有TimeZone.getAvailableIDs()的列表,但是,这通常会返回500 + {{1}的列表} {s} TimeZone并不总是用户友好(如displayName)。

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

GMT+05:00

他们所做的是解析整个<timezone id="America/New_York">Eastern Time</timezone>文件和put the (Olson) id and text in a List of Timezone Map

timezones.xml

接下来,对于该列表中的每个时区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添加到其中

所以最后,他们真正显示的是时区列表,他们从文件中检索ID:GMT

如果每个时区只有一个id,那么可能会有效的方法就是组成一个Olson ID列表并显示他们的timezones.xml。 如果你有更多,那可能不会有效,因为一些Olson id与其他{0}保持相同displayName,例如:displayNameEurope/Amsterdam都引用Europe/Brussels

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

答案 1 :(得分:3)

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());
            }
        } 
  

我认为这个可以帮助你

答案 2 :(得分:1)

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

getAvailableIDs()以第一个时区返回此偏移量(我不记得,但时区是“...... / Vostok”)。如果我尝试使用此时区添加事件,那么我在Google Calendar安卓应用程序中打开此添加的事件并查看,该时区设置不像普通的“美国/纽约”或“欧洲/莫斯科”,而只是“+ 6 GMT”。

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

上工作正确

答案 3 :(得分: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();
    // ...
}