在时区之间快速转换date

我有一个date存储在我的在线服务器数据库在GMT 。 我加载date并使用以下代码将其转换为用户的时区:

  if let messagedate = oneitem["timestamp"] as? String { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" let date = dateFormatter.dateFromString(messagedate) let source_timezone = NSTimeZone(abbreviation: "GMT") let local_timezone = NSTimeZone.systemTimeZone() let source_EDT_offset = source_timezone?.secondsFromGMTForDate(date!) let destination_EDT_offset = local_timezone.secondsFromGMTForDate(date!) let time_interval : NSTimeInterval = Double(destination_EDT_offset - source_EDT_offset!) let final_date = NSDate(timeInterval: time_interval, sinceDate: date!) curr_item.date = final_date } 

现在我需要将date转换回GMT ,以传达给服务器,但我不知道如何将其转换回GMT

难道你不能只用你的数据格式化与不同的时区,并将其转换? 如

 dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT") let gmtDate = dateFormatter.dateFromString(string: "your old date as string here") 

效率高出约50倍

使用GMT的偏移量大约是效率的22倍。

 extension Date { func convertToLocalTime(fromTimeZone timeZoneAbbreviation: String) -> Date? { if let timeZone = TimeZone(abbreviation: timeZoneAbbreviation) { let targetOffset = TimeInterval(timeZone.secondsFromGMT(for: self)) let localOffeset = TimeInterval(TimeZone.autoupdatingCurrent.secondsFromGMT(for: self)) return self.addingTimeInterval(targetOffset - localOffeset) } return nil } } 

由于NSDate总是在格林尼治标准时间(GMT)/ UTC,因此只有在将时区展示给用户或从用户获取时区时,它才是相关的。 只要始终假定它是UTC的内部,根据需要将其转换为用户(通过将其设置在NSDateFormatter ),并且不再需要担心该问题。

我build议

  • 你在你的dateFormatter上设置GMT时区直接得到UTC的NSDate(只有UTC的NSDate是一个很好的做法)
  • 当你需要显示它时,你会使用另一个NSDateFormatter,并在其上设置本地时区(默认情况下)
  • 当你需要发送一个date到你的服务器时,你再次使用dateFormatter生成一个string