[iOS 10] ISO8601DateFormatter について

2016.10.06

はじめに

こんにちは。モバイルアプリサービス部の平屋です。

本記事では iOS 10 で追加された ISO8601DateFormatter クラスを使ってできることを紹介していきます。

ISO8601DateFormatter とは

ISO8601DateFormatter は iOS 10 で Foundation フレームワークに追加されたクラスであり、以下の機能を提供します。

  • ISO 8601 形式の日付文字列から Date を生成
  • Date から ISO 8601 形式の日付文字列を生成

ISO 8601

ISO 8601 は日付と時刻の表記に関する国際規格です。

以下の API などで ISO 8601 形式の日付文字列が使用されています。

ISO 8601 形式の日付文字列から Date を生成

  • ISO 8601 形式の日付文字列から Date を生成するには date(from:) メソッドを使用します

「yyyy-MM-dd'T'HH:mm:ssZZZZZ」形式 (タイムゾーン指定あり) の場合

ISO8601DateFormatter のデフォルトのフォーマット形式は「yyyy-MM-dd'T'HH:mm:ssZZZZZ」なので、ISO8601DateFormatter オブジェクトを作成するだけで OK です。

let dateString = "2016-10-05T12:00:00+09:00"
let formatter = ISO8601DateFormatter.init()

// result!.description: 2016-10-05 03:00:00 +0000
let result = formatter.date(from: dateString)

「yyyy-MM-dd'T'HH:mm:ss」形式 (タイムゾーン指定なし) の場合

デフォルトのフォーマット形式以外の場合、formatOptions プロパティを使用して、フォーマット形式を指定します。

let dateString = "2016-10-05T12:00:00"
let formatter = ISO8601DateFormatter.init()

// withFullDate: 年月日を指定
// withTime: 時刻を指定 (フォーマットは HH:mm:ss)
// withDashSeparatorInDate: 日付の区切り文字に「-」を指定
// withColonSeparatorInTime: 時刻の区切り文字に「:」を指定
formatter.formatOptions = [.withFullDate,
                           .withTime,
                           .withDashSeparatorInDate,
                           .withColonSeparatorInTime]

// result!.description: 2016-10-05 12:00:00 +0000
let result = formatter.date(from: dateString)

Date から ISO 8601 形式の日付文字列を生成

Date から ISO 8601 形式の日付文字列を生成するには、以下のいずれかのメソッドを使用します。

  • string(from:)
  • string(from:timeZone:formatOptions:)

string(from:) メソッドを使用する

formatOptions プロパティの設定は、「ISO 8601 形式の日付文字列から Date を生成」する場合と同様です。

「yyyy-MM-dd'T'HH:mm:ssZZZZZ」形式 (タイムゾーン指定あり) の場合

let date = Date()
let formatter = ISO8601DateFormatter.init()
let result = formatter.string(from: date)

「yyyy-MM-dd'T'HH:mm:ss」形式 (タイムゾーン指定なし) の場合

let date = Date()
let formatter = ISO8601DateFormatter.init()
formatter.formatOptions = [.withFullDate,
                           .withTime,
                           .withDashSeparatorInDate,
                           .withColonSeparatorInTime]
let result = formatter.string(from: date)

string(from:timeZone:formatOptions:) メソッドを使用する

string(from:timeZone:formatOptions:) メソッドを使用すれば、Date, TimeZone, ISO8601DateFormatter.Options を指定して、日付文字列を生成することができます。

let date = Date()
let result = ISO8601DateFormatter.string(from: date,
                                         timeZone: TimeZone.current,
                                         formatOptions: [.withInternetDateTime])

timeZone プロパティについて

ISO8601DateFormatter には timeZone プロパティが用意されているので、Date から日付文字列を生成する時などにタイムゾーンを指定することができます。

let date = Date()
let formatter = ISO8601DateFormatter.init()
formatter.timeZone = TimeZone.current
let result = formatter.string(from: date)

さいごに

本記事では iOS 10 で追加された ISO8601DateFormatter クラスを使ってできることを紹介しました。これまで DateFormatter を拡張して実現していたような処理を独自で書かなくてよくなったのはちょっと嬉しい改良ですね。

参考資料