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