読者です 読者をやめる 読者になる 読者になる

iOSアプリ開発の逆引き辞典

iPhone/iPadで使えるアプリ開発のTipsをまとめてみました

文字列をNSDate型へ変換する

文字列(NSString)型から日付(NSDate)型へ変換します。

ここでは「2011-06-28 21:23:45」という文字列をNSDateFormatterクラスを使ってNSDate型へ変換します。

// フォーマットされる日付文字列
NSString *dateString = @"2011-06-28 21:23:45";

// フォーマット文字列を設定
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

// 文字列をNSDateに変換する
NSDate *formatterDate = [fmt dateFromString:dateString];

NSLog(@"出力:%@", formatterDate);

上記のコードを実行すると、下記のような出力を得ることができます。

出力:2011-06-28 12:23:45 +0000

NSDateFormatterクラスが解釈できない文字列を無視する

文字列からNSDate型へフォーマットする時に不要な文字列が含まれている場合は、アポストロフィー(')で不要な文字を挟む事でNSDateFormatterクラスに無視させる事が可能です。

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/の部分がNSDateFormatterクラスでは解釈することができず、NSDateへの変換に失敗することがわかりました。フォーマッターに無視して欲しい範囲をアポストロフィーで囲ってしまいます。

アポストロフィー(' ')で括られた範囲が、NSDateFormatterクラスの変換時に無視されます。以下のサンプルコードでいうところの「'Etc/'ZZZ」の部分です。

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

正しくフォーマットできていることが確認できます。