2010年12月25日土曜日

NSDateFormatterで文字列→日付に変換で困った


.NET/WCFのRESTなサービスからGETしたXMLをiPhone側でオブジェクトにするときのお話。
iOS SDKのバージョンは4.2。

サービスからGETしたXMLの日時型は、こんな文字列になってます。

2010-12-25T09:31:49.3974609+09:00

この文字列をNSDateFormatter dateFromString: でNSDateに変換しようとしても変換してくれません。

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ"];
NSDate *converted = [dateFormatter dateFromString:str];

仕方なくヘルプを見ると、

The format string uses the format patterns from the Unicode standard (this reference is to version tr35-6 for Mac OS X v10.5; for Mac OS X v10.4 use version tr35-4). (When the formatter is in v10.0 mode, you must use the old-style format strings, described in “Date Format String Syntax (Mac OS X Versions 10.0 to 10.3).”) Note with the Unicode format string format, you should enclose literal text in the format string inside single quotes ('), as illustrated in the following example:

iOS 4.2はtr35-6?tr35-4?
んーどうも、NSDateFormatter setDefaultFormatterBehavior: で10.5と10.4を切り替えれるみたいだけど、デフォルトはv10.5モードなので、tr35-6の仕様なのか。
というわけで、tr35-6の仕様を見ると、
Z 1..3 -0800 Use one to three letters for RFC 822, four letters for GMT format.
となってて、Zが1−3桁の場合RFC 822フォーマット、4桁の場合GMTフォ−マットとなるのですね。
(なんかややこしい仕様だな)
お!RFC 822の場合 +hhmmで間にコロン(:)が入ってたらダメなの?

というわけで、コロンを除いた文字列をdateFromString:に渡すと、無事変換してくれましたとさ。

適当に文字列から日付に変換してくれる仕組みってないのかなあ?