Mug*_*nan 1 parse-platform swift
有没有办法让服务器有时间使用swift.我想基于服务器设置静态时间.因此,即使用户更改时区和日期,也无关紧要,视图控制器上显示的时间将是基于服务器而非NSDate的时间
let today = NSDate()
println(today)
Run Code Online (Sandbox Code Playgroud)
目前上面的代码,如果在手机设置中改变了日期和时间.我也在我的代码中使用解析.有没有办法从解析中获取服务器时间.
基于此链接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)
由于网络调用的成本很高,因此
您不应每次需要获取正确的日期时间时都进行相同的网络调用。
从某个服务器获取时间时,将本地与服务器之间的时差存储在某处,并使用它来获取正确的日期。
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()
(例如,当应用程序进入后台时)