Web APIなんかでよく遭遇する、日時文字列とUNIX時間を相互に変換する方法について。Objective-CとSwiftでのUNIX時間の変換 でもまとめている方がいらっしゃいましたが、逆方向の変換がなかったので、それも含めてまとめてみました。SwiftでSimplenoteクライアントアプリを作ってみた でも使っています。
ちなみに、UNIX時間というのは前記リンクにも書いてありますが、1970年1月1日0時0分0秒からの経過秒数で表す時刻表現のこと。
変換方法
Swiftでは (というか、Objective-Cでも同じですが)、NSDateという日時を扱うクラス、及びNSDateFormatterという日時文字列フォーマットを扱うクラスを経由して、日時文字列とUNIX時間を相互に変換できます。また、UNIX時間を入れる変数にはNSTimeIntervalという型を使います。これは単なるdoubleのtypealiasです。
UNIX時間 => 日時文字列
// UNIX時間 "dateUnix" をNSDate型 "date" に変換
let dateUnix: NSTimeInterval = 1423053296
let date = NSDate(timeIntervalSince1970: dateUnix)
// NSDate型を日時文字列に変換するためのNSDateFormatterを生成
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
// NSDateFormatterを使ってNSDate型 "date" を日時文字列 "dateStr" に変換
let dateStr: String = formatter.stringFromDate(date)
日時文字列 => UNIX時間
// 日時文字列をNSDate型に変換するためのNSDateFormatterを生成
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
// NSDateFormatterを使って日時文字列 "dateStr" をNSDate型 "date" に変換
let dateStr: String = "2015-02-04 12:34:56"
let date: NSDate? = formatter.dateFromString(dateStr)
// NSDate型 "date" をUNIX時間 "dateUnix" に変換
let dateUnix: NSTimeInterval? = date?.timeIntervalSince1970
変換に関する補足
日時文字列のフォーマット
日時文字列 => UNIX時間の変換では、変換対象の文字列がNSDateFormatterで指定したフォーマットに合わずに変換できないとnilが返るので注意が必要です (そのため、Optionalになっている)。例えば、
let dateStr: String = "2015-02-04 12:34:56.123456"
のようにマイクロ秒表記が付いていると変換できません。このときは、
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSSSS"
とする必要があります。一方で、日付の区切りの "-" が "/" であっても問題なく変換できます。
タイムゾーン
上記の変換では日時はローカル時間として扱われますが、Web API等ではGMTとして扱う場合があります。その場合は、下記のようにタイムゾーンを指定します。こうすると、変換対象の日時がGMTとして扱われます。
formatter.timeZone = NSTimeZone(name: "GMT")