初リジェクトはNSLocale絡みで


わかってみるとあ〜そうか〜と思うことが多い開発勉強です。

自分の実機に合わせてアプリを作ってしまってて、リジェクトの再現ができなかった。なんでかと考え、環境をいじってみると再現。

NSLocale周りです。

作っている間は環境変えてテストしないとなぁと思っていたのですがすっきり忘れてました。

twitterのAPIで取得した日時文字列からデータを作ろうとしてDateformatterを使うのですがその辺で自分の認識の甘さもあって面倒が起きてました。

文字列からNSDateへ

まずdateFormatterのNSLocaleをen_USにセット。

それからdateFormatterのDateFormatに@"EEE MMM dd HH:mm:ss Z yyyy"をセット。

dateFormatterを使って文字列からNSDateを作る。

NSDateから文字列へ

今度はそのNSDateから日時の文字列をつくる。

DateFormatとNSLocaleに使いたいものを指定。

[NSLocale preferredLanguages]で実機の言語設定に使われる配列が取得できる。その配列の先頭が現在の言語設定なのでこう書く。
[lngArray objectAtIndex:0]これで設定値の文字列が取れる。

そこでこう書くとユーザー設定に変換できる。

[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:lngString] autorelease]];

あとはフォーマットを指定して
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];

こうすればNSDateからユーザータイムゾーンの日時データが取得できる。
NSString *formatDate = [dateFormatter stringFromDate:date];

実際のコードはこんな感じ

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
[dateFormatter setDateFormat:@"EEE MMM dd HH:mm:ss Z yyyy"];
NSDate *date =[dateFormatter dateFromString:[tweetitem valueForKey:@"created_at"]];
[tweetitem setObject:date forKey:@"created_date"];
NSArray *lngArray=[NSLocale preferredLanguages];
NSString *lngString=[lngArray objectAtIndex:0];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:lngString] autorelease]];
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
NSString *formatDate = [dateFormatter stringFromDate:date];
[tweetitem setObject:formatDate forKey:@"created_at"];

NSLocale周りは色々と詰まることも多そうなので記事にしてみました。
間違いがありましたらご指摘いただけると幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です