Swift获得服务器时间

Mug*_*nan 1 parse-platform swift

有没有办法让服务器有时间使用swift.我想基于服务器设置静态时间.因此,即使用户更改时区和日期,也无关紧要,视图控制器上显示的时间将是基于服务器而非NSDate的时间

 let today = NSDate()
 println(today)
Run Code Online (Sandbox Code Playgroud)

目前上面的代码,如果在手机设置中改变了日期和时间.我也在我的代码中使用解析.有没有办法从解析中获取服务器时间.

Mug*_*nan 7

基于此链接https://github.com/freak4pc/NSDate-ServerDate我为swift编写了代码.试过并测试过.它有效.

override func viewDidLoad() {
    super.viewDidLoad()

    //call ServerTimeReturn function

    serverTimeReturn { (getResDate) -> Void in
        var dFormatter = NSDateFormatter()
        dFormatter.dateStyle = NSDateFormatterStyle.LongStyle
        dFormatter.timeStyle = NSDateFormatterStyle.LongStyle
        dFormatter.timeZone = NSTimeZone(abbreviation: "GMT")
        var dateGet = dFormatter.stringFromDate(getResDate)

        println("Formatted Time : \(dateGet)")
    }

        }

    func serverTimeReturn(completionHandler:(getResDate: NSDate!) -> Void){

    let url = NSURL(string: "http://www.google.com")      
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
        let httpResponse = response as? NSHTTPURLResponse
        if let contentType = httpResponse!.allHeaderFields["Date"] as? String {

            var dFormatter = NSDateFormatter()
            dFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"
            var serverTime = dFormatter.dateFromString(contentType)
            completionHandler(getResDate: serverTime)
        }
    }

    task.resume()
}
Run Code Online (Sandbox Code Playgroud)


eas*_*lee 6

由于网络调用的成本很高,因此
您不应每次需要获取正确的日期时间时都进行相同的网络调用。

从某个服务器获取时间时,将本地与服务器之间的时差存储在某处,并使用它来获取正确的日期。

例子

private var timeGap: TimeInterval = 0
private var referenceDate = Date() {
    didSet { timeGap = Date().distance(to: referenceDate) }
}

var correctedDate: Date {
    let possibleDate = Date()
    let ignorableNetworkDelay: TimeInterval = 2

    guard abs(timeGap) > ignorableNetworkDelay else { return possibleDate }
    return possibleDate.advanced(by: timeGap)
}

func setReferenceDate() {
    let url = URL(string: "https://www.google.com")

    URLSession.shared.dataTask(with: url!) { _, response, _ in
        let httpResponse = response as? HTTPURLResponse
        if let stringDate = httpResponse?.allHeaderFields["Date"] as? String {
            let formatter = DateFormatter()
            formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"
            formatter.timeZone = TimeZone.current
            serverDate = formatter.date(from: stringDate) ?? Date()
        } else {
            print("getting reference date from web failed")
            referenceDate = Date()
        }
    }.resume()
}
Run Code Online (Sandbox Code Playgroud)

这样,我可以参考correctedDate任何时间,而不必担心费用,并且在需要更正日期时间时才
调用。setReferenceDate()

(例如,当应用程序进入后台时)