import Foundation
extension Date {
private static let processInfo = ProcessInfo()
private static var systemUptime: TimeInterval = 0
private static var serverTime: TimeInterval = 0
static func sycn(){
let url = URL(string: "https://work.weixin.qq.com")!
let task = URLSession.shared.dataTask(with: url) { (data: Data?, resp: URLResponse?, err: Error?) in
if let httpResp = resp as? HTTPURLResponse,
let dateStr = httpResp.allHeaderFields["Date"] as? String {
let serverDate: Date!
if let date = dateStr.dateValue(format: "EEE, dd MMM yyyy HH:mm:ss z") {
serverDate = date
} else if let date = dateStr.dateValue(format: "EEE, d MMM yyyy HH:mm:ss z") {
serverDate = date
} else if let date = dateStr.dateValue(format: "dd MMM yyyy HH:mm:ss") {
serverDate = date
} else if let date = dateStr.dateValue(format: "d MMM yyyy HH:mm:ss") {
serverDate = date
} else if let date = dateStr.dateValue(format: "dd MMM yyyy HH:mm") {
serverDate = date
} else if let date = dateStr.dateValue(format: "d MMM yyyy HH:mm") {
serverDate = date
} else {
return
}
// 互联网时间戳
serverTime = serverDate.timeIntervalSince1970
// 运行时间
systemUptime = processInfo.systemUptime
}
}
task.resume()
}
static var current: Date {
if serverTime == 0 {
if #available(iOS 15, *) {
return Date.now
} else {
return Date()
}
} else {
// 当前app运行时间 = (当前运行时间 - 旧运行时间)
// 当前时间 = 旧服务器时间 + app运行时间
// 当前时间 = 旧服务器时间 + (当前运行时间 - 旧运行时间)
let nowTimeInterval = serverTime + processInfo.systemUptime - systemUptime
return Date(timeIntervalSince1970: nowTimeInterval)
}
}
}
[Swift] 客户端与服务端时间同步
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 版本记录 前言 很多时候我们是需要服务器和客户端时间的同步的,比如说活动的倒计时,抢购等。而且做好时间同步还有一个...
- 最近项目中用到了很多倒计时的,比如获取验证码的页面、直播倒计时页面;这样就会导致app里有多个NSTimer在倒计...