本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在 Swift 中获取时间戳(Timestamp)的几种常见方法和它们的区别如下:

1. 使用 Date 对象

Date 对象代表了单一时刻,可以通过它获取自1970年1月1日(UTC)以来的秒数,这是最常见的方式。

获取当前时间的时间戳

let currentDate = Date()
let timeInterval = currentDate.timeIntervalSince1970
print(timeInterval)  // 输出一个Double,表示从1970到现在的秒数

获取毫秒时间戳

let milliseconds = currentDate.timeIntervalSince1970 * 1000
print(milliseconds)  // 输出自1970年以来的毫秒数

2. 使用 CFAbsoluteTimeGetCurrent

CFAbsoluteTimeGetCurrent 是 Core Foundation 中的方法,可以直接获取当前时间自2001年以来的秒数。

import CoreFoundation

let coreFoundationTime = CFAbsoluteTimeGetCurrent()
print(coreFoundationTime)  // 输出自2001年1月1日以来的秒数

同样,你可以将其转换为从1970年以来的秒数:

let unixTimestamp = coreFoundationTime + kCFAbsoluteTimeIntervalSince1970
print(unixTimestamp)  // 输出自1970年以来的秒数

3. 使用 DispatchTime

DispatchTimeDispatchWallTime 是 GCD 库中的类型,主要用于表示调度时间点。

获取当前时间

let dispatchTime = DispatchTime.now()
print(dispatchTime)  // 输出当前的调度时间点

转化为纳秒

let nanoTime = dispatchTime.uptimeNanoseconds
print(nanoTime)  // 输出从设备启动以来的纳秒数

转化为秒

let seconds = Double(nanoTime) / 1_000_000_000
print(seconds)  // 转换为秒数输出

4. 使用 ProcessInfo

ProcessInfo 可以用来获取进程运行到当前的时间。

import Foundation

let processInfo = ProcessInfo.processInfo.systemUptime
print(processInfo)  // 输出设备启动以来的秒数

区别总结

1、 Date + timeIntervalSince1970

  • 用途: 通用,适用于绝大多数获取当前时间的情况。
  • 优点: 易用,属于 Foundation 框架,精度上可以接受。
  • 缺点: 精度为 Double,秒级精度。

2、 CFAbsoluteTimeGetCurrent

  • 用途: Core Foundation 库的低级精确时间获取。
  • 优点: 更底层,如果需要与 Core Foundation 相配合很有用。
  • 缺点: 相对不常用,需将相对时间转换为常见的 Unix 时间戳。

3、 DispatchTime

  • 用途: 用于 GCD 调度相关的时间操作。
  • 优点: 高精度,纳秒级别,常用于性能分析和调度。
  • 缺点: 主要在 GCD 调度中使用,不适合表示绝对时间。

4、 ProcessInfo

  • 用途: 获取设备启动以后的时间。
  • 优点: 用于需要计算设备启动后经过时间的场景。
  • 缺点: 不表示绝对时间,只表示设备启动后的时间。

欢迎关注我的公众号AntDream查看更多精彩文章!


认真的紫菜
5 声望1 粉丝