我想获得时区,我可以在设置中看到:日期和时间 - >
是的,我知道,在java / android中可以通过TimeZone.getAvailableIDs()
获取所有时区,但我想只获得时区,存在于
答案 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
,例如:displayName
和Europe/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();
// ...
}