Date to milliseconds and back to date in Swift Date to milliseconds and back to date in Swift ios ios

Date to milliseconds and back to date in Swift


I don't understand why you're doing anything with strings...

extension Date {    var millisecondsSince1970:Int64 {        return Int64((self.timeIntervalSince1970 * 1000.0).rounded())    }    init(milliseconds:Int64) {        self = Date(timeIntervalSince1970: TimeInterval(milliseconds) / 1000)    }}Date().millisecondsSince1970 // 1476889390939Date(milliseconds: 0) // "Dec 31, 1969, 4:00 PM" (PDT variant of 1970 UTC)


As @Travis Solution works but in some cases

var millisecondsSince1970:Int WILL CAUSE CRASH APPLICATION ,

with error

Double value cannot be converted to Int because the result would be greater than Int.max if it occurs Please update your answer with Int64

Here is Updated Answer

extension Date { var millisecondsSince1970:Int64 {        return Int64((self.timeIntervalSince1970 * 1000.0).rounded())         //RESOLVED CRASH HERE    }    init(milliseconds:Int) {        self = Date(timeIntervalSince1970: TimeInterval(milliseconds / 1000))    }}

About Int definitions.

On 32-bit platforms, Int is the same size as Int32, and on 64-bit platforms, Int is the same size as Int64.

Generally, I encounter this problem in iPhone 5, which runs in 32-bit env. New devices run 64-bit env now. Their Int will be Int64.

Hope it is helpful to someone who also has same problem


@Travis solution is right, but it loses milliseconds when a Date is generated. I have added a line to include the milliseconds into the date:

If you don't need this precision, use the Travis solution because it will be faster.

extension Date {    func toMillis() -> Int64! {        return Int64(self.timeIntervalSince1970 * 1000)    }    init(millis: Int64) {        self = Date(timeIntervalSince1970: TimeInterval(millis / 1000))        self.addTimeInterval(TimeInterval(Double(millis % 1000) / 1000 ))    }}