Преобразование даты между часовыми поясами 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)
}
}