Get Unix Epoch Time in Swift

TimeSwift

Time Problem Overview


How do you get the seconds from epoch in Swift?

Time Solutions


Solution 1 - Time

You can simply use NSDate's timeIntervalSince1970 function.

let timeInterval = NSDate().timeIntervalSince1970

Solution 2 - Time

For Swift 3.0

Date().timeIntervalSince1970

Solution 3 - Time

You can get that using following

Int(Date().timeIntervalSince1970)

This is for current date, if you want to get for a given date

Int(myDate.timeIntervalSince1970)

If you want to convert back from UNIX time epoch to Swift Date time, you can use following

let date = Date(timeIntervalSince1970: unixtEpochTime)

Solution 4 - Time

1 second = 1,000 milliseconds
1 second = 1,000,000 microseconds

Swift's timeIntervalSince1970 returns seconds with what's documented as "sub-millisecond" precision, which I've observed to mean usually microseconds but sometimes one scale (one digit to the right of the decimal) less or more. When it returns a scale of 5 (5 digits after the decimal), I don't know if Swift is dropping the trailing 0 or it couldn't produce 6 scales of precision. But when it returns a scale of 7, that extra digit can be truncated because it's beyond microsecond precision. Therefore, for consistent and precision-true values:

let secondPrecision = Int(Date().timeIntervalSince1970) // definitely precise
let millisecondPrecision = Int(Date().timeIntervalSince1970 * 1_000) // definitely precise
let microsecondPrecision = Int(Date().timeIntervalSince1970 * 1_000_000) // most likely precise

Note that in the year 2038, 32-bit numbers won't be usable for the Unix timestamp, they'll have to be 64-bit.

All that said, millisecond-precision is the true Unix timestamp and the one that, I think, everyone should use. If you're working with an API or a framework that uses the Unix timestamp, most likely it will be millisecond-precise. Therefore, for a true Unix timestamp:

typealias UnixTimestamp = Int

extension Date {
    /// Date to Unix timestamp.
    var unixTimestamp: UnixTimestamp {
        return UnixTimestamp(self.timeIntervalSince1970 * 1_000) // millisecond precision
    }
}

extension UnixTimestamp {
    /// Unix timestamp to date.
    var date: Date {
        return Date(timeIntervalSince1970: TimeInterval(self / 1_000)) // must take a millisecond-precise Unix timestamp
    }
}

let unixTimestamp = Date().unixTimestamp
let date = unixTimestamp.date

Solution 5 - Time

If you don't want to import Foundation, i.e. for Linux use etc, you can use the following from CoreFoundation:

import CoreFoundation

let timestamp = CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChris RedfordView Question on Stackoverflow
Solution 1 - TimeYannikView Answer on Stackoverflow
Solution 2 - TimeSumit OberoiView Answer on Stackoverflow
Solution 3 - TimeMohammad SadiqView Answer on Stackoverflow
Solution 4 - TimeliquidView Answer on Stackoverflow
Solution 5 - TimershevView Answer on Stackoverflow