1

すべてのデバイスの連絡先の誕生日を取得するために、次の引数を使用して ContactsContract.Data.CONTENT_URI をクエリしています。

 final static Uri CONTENT_URI =
                ContactsContract.Data.CONTENT_URI;
    String SELECTION_ARGS = new String[] {
                        ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE,
                        String.valueOf(ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY)
                };
     String SELECTION =
                    ContactsContract.Data.MIMETYPE + " = ? AND "
                            + ContactsContract.CommonDataKinds.Event.TYPE + " = ? AND "
                            + ContactsContract.CommonDataKinds.Event.START_DATE + " NOT NULL";
String[] PROJECTION = {
            Data._ID,
            Data.CONTACT_ID,
            Data.LOOKUP_KEY,
            Utils.hasHoneycomb() ? Data.DISPLAY_NAME_PRIMARY : Data.DISPLAY_NAME,
            Utils.hasHoneycomb() ? Data.PHOTO_THUMBNAIL_URI : Data.CONTACT_ID,
            ContactsContract.CommonDataKinds.Event.START_DATE,
            SORT_ORDER,
    };
cur = getContext().getContentResolver().query(CONTENT_URI ,
                ContactsQuery.PROJECTION,
                SELECTION,
                SELECTION_ARGS,
                SORT_ORDER);

問題は、場合によっては START_DATE フィールドのフォーマットが異なる可能性があることです。返される値の一部は次のとおりです。

 1990-08-11
 --08-13
 Jan 1, 1970

何らかの理由で、Skypeから取得したすべての連絡先の誕生日が 1970 年 1 月 1 日に設定されているようです。

現在、私は次のように日付を解析しています:

    private final static SimpleDateFormat yearFull = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
    private final static SimpleDateFormat yearLess = new SimpleDateFormat("--MM-dd", Locale.US);
    Calendar signCal = Calendar.getInstance();
    Date date = null;

    try {
        date = yearFull.parse(birthday);
    } catch (ParseException e) {
        // e.printStackTrace();
        Log.w(TAG, "No year in " + birthday);
        // throw new IllegalArgumentException("Error parsing " + birthday);
        try {
            date = yearLess.parse(birthday);
        } catch (ParseException e1) {
            Log.e(TAG, "Couldn't parse yearLess " + birthday);
            e1.printStackTrace();
        }
    }
    signCal.setTime(date);

しかし、1970 年 1 月 1 日のケースは見逃されています。

いくつの異なるフォーマットがありますか? Contacts テーブルの START_DATE 値を使用するベスト プラクティスは何ですか?

すべての形式を処理するコードを作成することは可能ですか?

4

1 に答える 1

2

最初にフォーマットを指定せずにあらゆる種類の日付を解析することはできないと思いますが、解析をより拡張可能にする良い考えは、 SimpleDateFormat オブジェクトの配列またはリストを作成し、それらのいずれかになるまでそれらすべてを反復することです文字列を正常に解析します。

あなたの場合:

private final static SimpleDateFormat[] formats = new SimpleDateFormat[] {
    new SimpleDateFormat("yyyy-MM-dd", Locale.US),
    new SimpleDateFormat("--MM-dd", Locale.US)
};

Calendar signCal = Calendar.getInstance();

boolean dateParsedSuccessfully = false;

for(SimpleDateFormat format : formats) {

    try {

        signCal.setTime(format.parse(birthday));

        dateParsedSuccessfully = true;

        break;

    } catch (ParseException e) {

    }
}

if(!dateParsedSuccessfully) {
    throw new SomeKindOfException("Can't parse birthdate");
}

したがって、新しい日付形式を追加するたびに、配列に新しいオブジェクトを追加するだけです。

"1970 年 1 月 1 日" 形式は Date#toString の既定の形式であり、必ずしも Skype で使用される形式ではないことに注意してください。

于 2013-08-28T07:41:06.347 に答える