在Swift中获取Unix Epoch Time

Chr*_*ord 87 time swift

你怎么从斯威夫特的时代中获得秒数?

小智 139

您可以简单地使用NSDate的timeIntervalSince1970功能.

let timeInterval = NSDate().timeIntervalSince1970
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这需要导入Foundation. (7认同)
  • 不使用基金会怎么样? (3认同)
  • 如果您不想使用粉底,那么您可以使用AFNetworking/AlamoFire(https://github.com/Alamofire/Alamofire)加载https://currentmillis.com/,然后解析页面的html.请注意,您必须考虑网络延迟并检查连接.我决定只使用基金会...... (3认同)
  • 作为一个整数怎么样? (2认同)

Sum*_*roi 69

对于Swift 3.0

Date().timeIntervalSince1970
Run Code Online (Sandbox Code Playgroud)

  • UNIX时间格式为毫秒.所以Int(Date().timeIntervalSince1970*1000) (45认同)
  • @ CHiP-love-NY:事实并非如此。[Unix时间](https://en.wikipedia.org/wiki/Unix_time)是自UTC以来1970年1月1日的秒数。 (3认同)
  • 好的.此外,人们可能会对http://stackoverflow.com/questions/39811352/swift-3-date-vs-nsdate感兴趣 (2认同)
  • 它返回一个 [TimeInterval](https://developer.apple.com/documentation/foundation/timeinterval),以秒为单位 (2认同)

bso*_*sod 12

1 秒 = 1,000 毫秒
1 秒 = 1,000,000 微秒

SwifttimeIntervalSince1970返回的秒数被记录为“亚毫秒”精度,我观察到这通常意味着微秒,但有时会少或多一个刻度(小数点右边的一位数字)。当它返回 5 的小数位(小数点后 5 位)时,我假设 Swift 无法产生 6 个小数位的精度,而当它返回 7 的小数位时,多余的数字可以被截断,因为它超出了微秒精度。所以:

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
Run Code Online (Sandbox Code Playgroud)

话虽如此,毫秒精度是真正的 Unix 时间戳,我认为每个人都应该使用它。如果您正在使用使用 Unix 时间戳的 API 或框架,那么它很可能是毫秒精度的。因此,对于 Swift 中真正的 Unix 时间戳:

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
Run Code Online (Sandbox Code Playgroud)

请注意,在 2038 年,32 位数字将无法用于 Unix 时间戳,它们必须是 64 位,但 Swift 会自动为我们处理,这样我们就可以安全地使用(并且Int不需要Int64显式使用)。


Moh*_*diq 7

您可以使用以下方法获得

Int(Date().timeIntervalSince1970)
Run Code Online (Sandbox Code Playgroud)

这是当前日期,如果您想获取给定日期

Int(myDate.timeIntervalSince1970)
Run Code Online (Sandbox Code Playgroud)

如果要将 UNIX 时间纪元转换回 Swift 日期时间,可以使用以下方法

let date = Date(timeIntervalSince1970: unixtEpochTime)
Run Code Online (Sandbox Code Playgroud)