I want to get TimeZones, that I can see in settings: Date and Time -->
Yes, I know, that in java/android can get all timezones by TimeZone.getAvailableIDs()
, but I want get only timezones, that exists on
.
正如您所注意到的,可以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)id
和text
List 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,可能不适用于低/高版本。如果您想获得更多关于您自己的版本的信息,请参考:此链接
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());
}
}
我想这个对你有帮助
是的,我已经尝试选择一个偏移量 - 一个时区。但在这种情况下会出现另一个错误。我使用这个时区以编程方式将事件添加到谷歌日历(解析 ics 文件)。在某些时区我有问题。例如,我添加了时区 +6 GMT 的事件。
getAvailableIDs() 以这个偏移量返回某个第一个时区(我不完全记得,但时区是“.../Vostok”)。如果我尝试使用这个时区添加事件,那么我在 Google 日历 Android 应用程序中打开了这个添加的事件,然后看到,该时区设置不是正常的“美国/纽约”或“欧洲/莫斯科”,而只是“+ 6 GMT”。
所以我开始查看列表“标准”时区。现在我用了另一种方式。我在谷歌日历源中搜索,发现他们没有在运行时使用一些 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();
// ...
}