[Swift] 客户端与服务端时间同步


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)
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容