7

設定で確認できるTimeZonesを取得したい:日付と時刻->

タイムゾーンを選択

はい、私は知っています、java / androidではすべてのタイムゾーンを取得できますがTimeZone.getAvailableIDs()、に存在するタイムゾーンのみを取得したいです

設定画面

4

4 に答える 4

10

お気づきTimeZoneのように、を呼び出すことでデバイスで利用可能なすべてののリストを取得できますが、これは通常、 (のように)常にユーザーフレンドリーではないTimeZone.getAvailableIDs()500以上TimeZoneのリストを返します。displayNameGMT+05:00

したがって、Androidのタイムゾーンリストを見ると、約80の要素のみで構成されており、名前とすべてが適切にフォーマットされています。ソースコード(Kitkatまで)を見ると、にあるxmlから実際にタイムゾーンを取得していることがわかります/res/xml/timezones.xml。各行は次のように定義されます。

<timezone id="America/New_York">Eastern Time</timezone>

つまり、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<Map<String, Object>> sortedList = ZoneGetter.getZonesList(context);
        Collections.sort(sortedList, comparator);
        final SimpleAdapter adapter = new SimpleAdapter(context,
                sortedList,
                layoutId,
                from,
                to);

        return adapter;
    }

次に、そのリスト内のタイムゾーンごとに、関連付けられた感謝をMap取得し、関連付けられたとを追加します。TimeZoneTimeZone.getTimeZone(String id)offsetGMT

つまり、実際に表示されるのは、ファイルからIDを取得するタイムゾーンのリストですtimezones.xml


タイムゾーンごとに1つのIDがある場合に機能する可能性があるのは、Olson IDのリストを作成し、それらを表示することdisplayNameです。いくつかのOlsonIDはdisplayName他のIDと同じであるため、次のように、それ以上ある場合は機能しない可能性がEurope/Amsterdamあります。Europe/Brussels両方ともを参照しEuropean Central Timeます。

注:この投稿は主にキットカットに焦点を当てており、下位/上位バージョンには適用されない場合があります。自分のバージョンの詳細を知りたい場合は、このリンクを参照してください。

于 2016-03-17T18:21:35.563 に答える
4
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());
            }
        } 

これはあなたを助けると思います

于 2012-12-27T18:57:43.300 に答える
1

はい、私はすでに1つのオフセット(1つのタイムゾーン)を選択しようとしています。ただし、この場合、別のエラーが発生します。このタイムゾーンを使用して、プログラムでイベントをGoogleカレンダーに追加しました(ics-fileを解析します)。いくつかのタイムゾーンで問題が発生します。たとえば、タイムゾーン+6GMTのイベントを追加します。

getAvailableIDs()は、このオフセットで最初のタイムゾーンを返します(正確には覚えていませんが、タイムゾーンは「... / Vostok」でした)。このタイムゾーンでイベントを追加しようとすると、この追加されたイベントをGoogleカレンダーのAndroidアプリケーションで開いて、そのタイムゾーンが通常の「アメリカ/ニューヨーク」または「ヨーロッパ/モスクワ」ではなく、単に「+6GMT」に設定されていることを確認します。

そこで、「標準」のタイムゾーンのリストを探し始めました。今、私は別の方法を使用しました。私はグーグルカレンダーソースで検索し、それらがいくつかのprocで実行時にタイムゾーンを取得しないことを発見しましたが、静的配列にいくつかのタイムゾーンIDを設定するだけです。今、私もこのリストを使用しました。このリストがAndroidバージョンからどのように変わったかはわかりません。しかし、4.xと2.xでは正しく機能しました

于 2012-12-27T22:34:41.443 に答える
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();
    // ...
}
于 2012-12-27T18:03:38.783 に答える