酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOSでNSDateFormatterでフォーマットされたくない文字列を無視する

本記事は「UNIX時刻からNSDate型へ変換する - iOSアプリ開発の逆引き辞典」に転記しました。


Store KitのVerifyReceipt(レシート有効性確認)を行うと、以下のようなJSONが返ってきます。購入日(purchase_date)のフォーマットが「2011-05-23 18:23:45 Etc/GMT」となっています。NSDateFormatterで素直にフォーマットしてみましたがnilが返ってきました。

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"ja"] autorelease]];

NSDate* date = [dateFormatter dateFromString:@"2011-05-23 02:30:01 Etc/GMT"];
NSLog(@"date: %@", date);  // 出力:(null)

「Etc/GMT」でひとつのタイムゾーンではなく「Etc/」はNSDateFormatterがフォーマット出来ないので、NSDateFormatter:NSString*メソッドで"2011-05-23 18:23:45 Etc/GMT"の"Etc/"の部分を認識しない様にフォーマットを設定しました。

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss 'Etc/'ZZZ"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"ja"] autorelease]];

NSDate* date = [dateFormatter dateFromString:@"2011-05-23 02:30:01 Etc/GMT"];
NSLog(@"date: %@", date);  // 出力:2011-05-23 02:30:01 +0000

これで正しくフォーマットされました。「 'Etc/'ZZZ」のアポストロフィー(' ')にあたる部分です。フォーマッターに無視して欲しい箇所をアポストロフィーで囲みましょう。

Data Formatting Guide:Date Formatters