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

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

选择时区

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

设置屏幕

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

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

Eastern Time

所以他们所做的就是解析整个timezones.xml文件, 并将(Olson) idtext放在时区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> sortedList = ZoneGetter.getZonesList(context); Collections.sort(sortedList, comparator); final SimpleAdapter adapter = new SimpleAdapter(context, sortedList, layoutId, from, to); return adapter; } 

接下来,对于该列表中的每个时区Map ,由于TimeZone.getTimeZone(String id) ,它们将检索关联的TimeZone ,并将相关的offsetGMT添加到其中。

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


如果每个时区有一个id,那么可以工作的就是组成一个Olson ID列表并显示它们的displayName 。 如果你有更多,那可能不会起作用,因为一些Olson id拥有与其他的相同的displayName ,例如: Europe/AmsterdamEurope/Brussels都指European Central Time

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

 String[]TZ = TimeZone.getAvailableIDs(); ArrayList TZ1 = new ArrayList(); for(int i = 0; i < TZ.length; i++) { if(!(TZ1.contains(TimeZone.getTimeZone(TZ[i]).getDisplayName()))) { TZ1.add(TimeZone.getTimeZone(TZ[i]).getDisplayName()); } } 

我想这个对你很有帮助

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

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

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

一旦你调用了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(); // ... }