Edited at

Swiftで NSDate ⇔ Long(Int64) 相互変換する方法

More than 3 years have passed since last update.


目的

日時をLong(Int64)にしたかっただけなのに、

他言語なら調べると簡単に見つかるのにSwiftだとなかなか見つからなかった

例えば、Ruby, Java, JavaScriptなら...


Ruby

Time.new.to_i * 1000

# => 1474443262000(ミリ秒に合わせるために1000をかけました)


Java

new java.util.Date().getTime()

// => 1474443315450


JavaScript(Node.js)

Date.parse(new Date())

// 1474443474000

といった感じで簡単にDateからLong(Int)に変換できる


SwiftでのNSDate⇔Int64の相互変換

以下のコードが動くようなExtensionです

date.toInt64()   // NSDateからInt64へ

int64.toNSDate() // Int64からNSDate

extension NSDate{

// NSDate -> Int64
func toInt64() -> Int64{
return Int64(timeIntervalSince1970 * 1000)
}
}

extension Int64{
// Int64 -> NSDate
func toNSDate() -> NSDate{
return NSDate(timeIntervalSince1970: Double(self / 1000) + Double(self % 1000)/1000)

}
}


動作確認

let date  = NSDate()

let int64 = date.toInt64()

print("date : ", date)
print("toInt64 : ", int64)
print("toNSDate: ", int64.toNSDate())

出力

Int64に変換して逆変換でNSDateにちゃんと戻っていることが確認できました

date    :  2016-09-21 8午前8:07:47 +0000

toInt64 : 1474445267102
toNSDate: 2016-09-21 8午前8:07:47 +0000


問題点 解決済み(2016/09/27)

ごめんなさい、問題点があります

Double()Int64の値をDoubleにすると少し値の精度が落ちてしまいます

そのため、Int64#toNSDate()はおそらくミリ秒の部分で多少の誤差が発生してしまうと思われます。

上記の問題点は@nisinさんのお力によって無事に解決しました!@nisinさんありがとうございます!

詳しい変更はこちらの変更履歴をご参照ください

http://qiita.com/nwtgck/items/2689cc6e7cb339757d1c/revisions/3


参考にしたところ