本文首发于公众号“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
DispatchTime
和 DispatchWallTime
是 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查看更多精彩文章!