2011年5月23日月曜日

twitterの検索結果のcreated_atをNSDateに変換する(Objective-C)

うーん、タイムラインを単純に要求した場合と検索した場合とで返ってくる「created_at」のフォーマットが違うのだ。
Web上にあるサンプルはタイムラインを要求した場合のものなので、単純に真似てもうまくいきません。

NSDateFormatter* inFormat = [[NSDateFormatter alloc] init];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[inFormat setLocale:locale];
[locale release];
[inFormat setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];

NSDate *date = [inFormat dateFromString:createAt];
[inFormat release]; 

変数「createAt」にTwitterから取得した「create_at」が入っているものと仮定しています。上のコードを実行するとdateに「create_at」が指している日付オブジェクトが格納されます。

Twitterから返ってくるcreated_atの値は「Mon, 23 May 2011 12:23:50 +0000」といった値なのだけど、Web上にあるコード例(タイムライン要求時)だと「Mon May 23 12:23:50 +0000 2011」という形式を想定しているのでそのままでは動かない。

とにかく「Mon, 23 May 2011 12:23:50 +0000」という形で返ってくるのでNSDateFormatterには「EEE, dd MMM yyyy HH:mm:ss Z」としなくてはいけない。

また、忘れてはいけないのがNSLocaleで「en_US」を指定すること(多分、en_**なら何でも良さそうだけど試してません)。
こうしないと「Mon」や「May」といった英語表記をうまく拾ってくれません。

海外のサンプルコードだとNSDateFormatterの末尾を「+0000」としているものがあるけれど、こうするとロケールを「en_US」にしているのでNSDateも米国時間で作られてしまう。なので「Z」としてやることで、日本の環境では日本時間になるよう指定します。