我使用以下参数查询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值的最佳做法是什么?
是否可以使用一段处理所有格式的代码?
答案 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使用的格式。