如何处理不同的生日格式? Skype于1970年1月1日返回

时间:2013-08-27 19:26:46

标签: android simpledateformat skype contactscontract

我使用以下参数查询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值的最佳做法是什么?

是否可以使用一段处理所有格式的代码?

1 个答案:

答案 0 :(得分: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使用的格式。