Преобразование даты между часовыми поясами swift

у меня есть дата, хранящаяся в моей базе данных онлайн-сервера, которая находится в GMT. Я загружаю дату и преобразую ее в часовой пояс пользователя, используя следующий код:

 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
 }

теперь мне нужно преобразовать дату назад GMT для того, чтобы общаться на сервер, однако я не уверен, как преобразовать его обратно в GMT.

5 ответов


Не могли бы вы просто использовать форматер данных снова с другим часовым поясом и конвертировать его? Такие как

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

около 50 раз эффективнее

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) по мере необходимости, и вам больше не придется беспокоиться о проблеме.


предлагаю

  • вы устанавливаете часовой пояс GMT на своем dateFormatter чтобы получить обратно непосредственно NSDate в UTC (наличие только NSDates в UTC-хорошая практика)
  • когда вам нужно отобразить его, вы используете другой NSDateFormatter с установленным на нем локальным часовым поясом (по умолчанию)
  • когда вам нужно отправить дату на ваш сервер, вы используете dateFormatter снова создать строку

более простая версия:

extension Date {
    func convertToTimeZone(initTimeZone: TimeZone, timeZone: TimeZone) -> Date {
         let delta = TimeInterval(timeZone.secondsFromGMT() - initTimeZone.secondsFromGMT())
         return addingTimeInterval(delta)
    }
}