PIYO - Tech & Life -

ISO8601拡張表記のNSStringをNSDateに変換する

ISO Objective-C iOS

iOSアプリで日付文字列をNSDateに変換する話です。よく知られているように、NSDateFormatterを使って変換をするのが一般的です。

NSDateFormatter* formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSDate* date = [formatter dateFromString:@"2014/01/07 10:35:24"];

フォーマッタに変換したい文字列を解析するための書式を渡して変換するというわけです。ここまでが基本。

さて、先日YoutubeのAPIに関する記事を書きました。

YouTubeAPI超入門 使い始めから検索まで - ぴよログ

[https://blog.piyo.tech/posts/2014-01-24-212903:image:large]

この記事では使い方のサンプルと戻ってくる文字列を載せましたが、その中に投稿日時publishedAtというデータ項目があります。

   "snippet": {
    "publishedAt": "2013-10-04T05:16:29.000Z",
    "channelId": "UCZfWmiGEbwWNPMe2nr3WdDg",
    "title": "【WOWOW】U-12ジュニアサッカーワールドチャレンジ2013 FCバルセロナ ダイジェスト",
    "description": "U-12ジュニアサッカーワールドチャレンジ2013 FCバルセロナ ダイジェスト ☆U-12 Junior soccer world challenge 2013 FC Barcerona Infantil B digest 2013年8月27 ...",
    "thumbnails": { 

ありますね、"2013-10-04T05:16:29.000Z"とかいうのが。

これをどうやってNSDateにするんだというのが今日の本題です。

ISO 8601 拡張表記

そもそも、日時の表記は国際規格で決められています。

ISO 8601 - Wikipedia

YoutubeのAPIで取れるのはこのISO 8601の拡張表記というもので、YYYY-MM-DDThh:mm:ss[.nnnnnn]Zのような形式を取ります。頭から、年、月、日、区切り文字T、時、分、秒、[うるう秒]、タイムゾーンを意味します。

詳しくは述べませんが角括弧のnnnnnnはうるう秒で、Youtubeの投稿日時を扱うような場合には大した問題にはならず無視できるはずです。

最後のタイムゾーンは、ZとあればUTCです。東京のように時差がある場合は+09:00のように表記します。Youtubeの表記はUTCですね。

これで変換したい文字列のことがよくわかりました。

実装!

実装はこのようになりました。つまるところdateFormatを正しくしてあげればよいわけです。区切り文字の関係で少し癖のある書き方になっています。

NSDateFormatter* formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
formatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSDate* date = [formatter dateFromString:@"2013-10-04T05:16:29.000Z"];