設定で確認できるTimeZonesを取得したい:日付と時刻->
はい、私は知っています、java / androidではすべてのタイムゾーンを取得できますがTimeZone.getAvailableIDs()
、に存在するタイムゾーンのみを取得したいです
。
お気づきTimeZone
のように、を呼び出すことでデバイスで利用可能なすべてののリストを取得できますが、これは通常、 (のように)常にユーザーフレンドリーではないTimeZone.getAvailableIDs()
500以上TimeZone
のリストを返します。displayName
GMT+05:00
したがって、Androidのタイムゾーンリストを見ると、約80の要素のみで構成されており、名前とすべてが適切にフォーマットされています。ソースコード(Kitkatまで)を見ると、にあるxmlから実際にタイムゾーンを取得していることがわかります/res/xml/timezones.xml
。各行は次のように定義されます。
<timezone id="America/New_York">Eastern Time</timezone>
つまり、timezones.xml
ファイル全体を解析し、(Olson)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;
}
次に、そのリスト内のタイムゾーンごとに、関連付けられた感謝をMap
取得し、関連付けられたとを追加します。TimeZone
TimeZone.getTimeZone(String id)
offset
GMT
つまり、実際に表示されるのは、ファイルからIDを取得するタイムゾーンのリストですtimezones.xml
。
タイムゾーンごとに1つのIDがある場合に機能する可能性があるのは、Olson IDのリストを作成し、それらを表示することdisplayName
です。いくつかのOlsonIDはdisplayName
他のIDと同じであるため、次のように、それ以上ある場合は機能しない可能性がEurope/Amsterdam
あります。Europe/Brussels
両方ともを参照しEuropean Central Time
ます。
注:この投稿は主にキットカットに焦点を当てており、下位/上位バージョンには適用されない場合があります。自分のバージョンの詳細を知りたい場合は、このリンクを参照してください。
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());
}
}
これはあなたを助けると思います
はい、私はすでに1つのオフセット(1つのタイムゾーン)を選択しようとしています。ただし、この場合、別のエラーが発生します。このタイムゾーンを使用して、プログラムでイベントをGoogleカレンダーに追加しました(ics-fileを解析します)。いくつかのタイムゾーンで問題が発生します。たとえば、タイムゾーン+6GMTのイベントを追加します。
getAvailableIDs()は、このオフセットで最初のタイムゾーンを返します(正確には覚えていませんが、タイムゾーンは「... / Vostok」でした)。このタイムゾーンでイベントを追加しようとすると、この追加されたイベントをGoogleカレンダーのAndroidアプリケーションで開いて、そのタイムゾーンが通常の「アメリカ/ニューヨーク」または「ヨーロッパ/モスクワ」ではなく、単に「+6GMT」に設定されていることを確認します。
そこで、「標準」のタイムゾーンのリストを探し始めました。今、私は別の方法を使用しました。私はグーグルカレンダーソースで検索し、それらがいくつかの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();
// ...
}