2013-08-27 59 views
1

我查詢ContactsContract.Data.CONTENT_URI以以下的參數,以獲得所有設備聯絡人的生日如何處理不同的生日格式? Skype的返回1970年1月1日

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

但它錯過了1970年1月1日的情況。

有多少種不同的格式?使用聯繫人表的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"); 
} 

所以每次你想添加你剛纔到一個新的對象添加到陣列中一個新的日期格式。

請注意,「1970年1月1日」格式是Date#toString的默認格式,它不一定是Skype使用的格式。

+0

如果您確實知道需要什麼樣的格式,那麼通過SimpleDateFormats列表進行迭代確實是一個好方法。 START_DATE是從聯繫人表中獲取的TEXT(字符串)值。 「1970年1月1日」在表格中保存。 –

+0

可能沒有一種方法來解析日期而不知道日期事先會有的各種格式,據我所知,沒有通用的日期格式分析器。因此你必須先做你的研究。 – vdaras

相關問題