2013-08-27 1 views
1

Я запрашивая ContactsContract.Data.CONTENT_URI со следующими аргументами, для того, чтобы получить все юбилеи контактов устройстваКак обращаться с разными форматами рождения? Skype возвращается 1 января 1970 г.

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, как представляется, имеют свои дни рождения установить до 1 января 1970 года

В настоящее время я разборе даты например:

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); 

, но он пропускает случай 1 января 1970 года.

Сколько различных форматов есть? Какова наилучшая практика использования значения START_DATE в таблице контактов?

Возможно ли иметь кусок кода, который обрабатывает все форматов?

ответ

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"); 
} 

Таким образом, каждый раз, когда вы хотите добавить новый формат даты, вы должны просто добавить новый объект в массив.

Имейте в виду, что формат «1 января 1970 года» является стандартным форматом Date # toString, это не обязательно формат, используемый Skype.

+0

Итерация через список SimpleDateFormats - это хороший подход, если вы знаете, какие форматы ожидать. START_DATE - значение TEXT (String), взятое из таблицы контактов. «1 января 1970 года» сохраняется как в таблице. –

+0

Возможно, нет возможности разобрать даты, не зная различных форматов, которые будут иметь даты заранее, насколько мне известно, нет универсального парсера формата даты. Следовательно, сначала вам нужно будет сделать свое исследование. – vdaras