Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert Date to Integer in Swift

I am updating some of my old Swift 2 answers to Swift 3. My answer to this question, though, is not easy to update since the question specifically asks for NSDate and not Date. So I am creating a new version of that question that I can update my answer for.

Question

If I start with a Date instance like this

let someDate = Date()

how would I convert that to an integer?

Related but different

These questions are asking different things:

  • Swift convert unix time to date and time
  • Converting Date Components (Integer) to String
  • Convert Date String to Int Swift
like image 407
Suragch Avatar asked Oct 08 '16 15:10

Suragch


3 Answers

Date to Int

// using current date and time as an example
let someDate = Date()

// convert Date to TimeInterval (typealias for Double)
let timeInterval = someDate.timeIntervalSince1970

// convert to Integer
let myInt = Int(timeInterval)

Doing the Double to Int conversion causes the milliseconds to be lost. If you need the milliseconds then multiply by 1000 before converting to Int.

Int to Date

Including the reverse for completeness.

// convert Int to TimeInterval (typealias for Double)
let timeInterval = TimeInterval(myInt)

// create NSDate from Double (NSTimeInterval)
let myNSDate = Date(timeIntervalSince1970: timeInterval)

I could have also used `timeIntervalSinceReferenceDate` instead of `timeIntervalSince1970` as long as I was consistent. This is assuming that the time interval is in seconds. Note that Java uses milliseconds.

Note

  • For the old Swift 2 syntax with NSDate, see this answer.
like image 75
Suragch Avatar answered Nov 14 '22 22:11

Suragch


If you are looking for timestamp with 10 Digit seconds since 1970 for API call then, below is code:

Just 1 line code for Swift 4/ Swift 5

let timeStamp = UInt64(Date().timeIntervalSince1970)

print(timeStamp) <-- prints current time stamp

1587473264

let timeStamp = UInt64((Date().timeIntervalSince1970) * 1000) // will give 13 digit timestamp in milli seconds
like image 25
vilas deshmukh Avatar answered Nov 14 '22 21:11

vilas deshmukh


timeIntervalSince1970 is a relevant start time, convenient and provided by Apple.

If u want the int value to be smaller, u could choose the relevant start time you like

extension Date{
    var intVal: Int?{
        if let d = Date.coordinate{
             let inteval = Date().timeIntervalSince(d)
             return Int(inteval)
        }
        return nil
    }


    // today's time is close to `2020-04-17 05:06:06`

    static let coordinate: Date? = {
        let dateFormatCoordinate = DateFormatter()
        dateFormatCoordinate.dateFormat = "yyyy-MM-dd HH:mm:ss"
        if let d = dateFormatCoordinate.date(from: "2020-04-17 05:06:06") {
            return d
        }
        return nil
    }()
}


extension Int{
    var dateVal: Date?{
        // convert Int to Double
        let interval = Double(self)
        if let d = Date.coordinate{
            return  Date(timeInterval: interval, since: d)
        }
        return nil
    }
}

Use like this:

    let d = Date()

    print(d)
    // date to integer, you need to unwrap the optional
    print(d.intVal)

    // integer to date
    print(d.intVal?.dateVal)
like image 1
black_pearl Avatar answered Nov 14 '22 21:11

black_pearl