6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-21

目的

日時を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

参考にしたところ

6
4
4

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
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?