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 回答