LoginSignup
73

More than 5 years have passed since last update.

Swiftで日時文字列とUNIX時間を相互に変換する方法

Last updated at Posted at 2015-02-05

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")

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73