【Swift】DataFormatterを使って文字列型をDate型に変換する

SwiftにはDataFormatterというクラスがあり、これを使うと文字列型で取得した日付をDate型で取り込むことができます。

例えば、RSSフィードなどに記載されている記事の投稿日時です。

よく見る形ですが、以下のようになっていると思います。

"Tue, 16 Aug 2016 15:27:33 +0000"

「曜日, 日付 月 西暦 時間 タイムゾーン」

の形です。

JSTなどの日本時刻だと+9時間、「+0900」で示されます。

SwiftのXML Parserを使うと、文字列型として取得します。

文字列型だと日付順のソートができないので、DateFormatter()を使ってDate型に変換する必要があります。

var dateString = "Tue, 16 Aug 2016 15:27:33 +0000"

let dateFormatter = DateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") as Locale
dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
let date = dateFormatter.date(from: dateString)!
print(date)

// String to Date
//error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION

読み取り時にはlocaleを”ja_JP”にするとエラーが発生します。

日本時間では読み取れないのでしょう。

アメリカの時刻でありコンピュータ時間でもあるen_US_POSIXを指定します。

指定できるロケールの一覧はこのサイトにあります。

dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
let date = dateFormatter.date(from: dateString)!
print(date)

dateFormatを指定していますが、これはdataStringのフォーマットに合わせて指定するものです。

  • E = 曜日
  • d = 日付
  • MMM = 月
  • yyyy = 西暦
  • HH:mm:ss = 時間
  • z = タイムゾーン

RSSフィードの時間フォーマットは決まっていますので、dateFormatが違っている(例えば、zがない)と実行時にエラーが出ます。

yやMの数を調整するのは問題ありません。

実行結果は以下の通り。Date型で出力されます。

2016-08-16 15:27:33 +0000

これでパースした後にソートすることができます。

せっかくなのでData型から文字列型に変換する方法もみていきましょう。

先ほどと違い、Data型から文字列型への変換の時には`localeIdentifier`やdataFormatは自由に指定できます。

日本時刻にして「西暦/月/日付 時間」で表示してみます。

// Date to String
dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") as Locale
dateFormatter.dateFormat = "yyyy/MM/dd HH:mm Z"
dateString = dateFormatter.string(from: date)

print(dateString)

出力は以下の通り。

ロケールを日本に指定しているため+0900になっています。

2016/08/17 00:27 +0900

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog