Добавление смещения времени в Swift

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

Я получаю смещение часового пояса пользователей по часовой стрелке и преобразовываю его в часы.

NSTimeZone.localTimeZone().secondsFromGMT / 60 / 60

Затем мне нужно найти способ добавления часов к объекту даты.. вот где я/м борется.

let formatter = NSDateFormatter()
    formatter.dateFormat = "HH:mm"

    let date = formatter.dateFromString(timeAsString)
    println("date: \(date!)")

Затем я создаю строку с датой для использования в метке, чтобы ее было легко читать с помощью AM/PM.

    formatter.dateFormat = "H:mm"
    formatter.timeStyle = .ShortStyle
    let formattedDateString = formatter.stringFromDate(date!)
    println("formattedDateString: \(formattedDateString)")

Я просто не могу понять, как добавлять/вычитать часы. Я разделил строку вверх, но иногда она становится отрицательной и не будет работать. Возможно, я собираюсь сделать это неправильно.

Спасибо за любую помощь.

Кит

Ответы

Ответ 1

Если вы хотите преобразовать время показа, которое хранится в виде строки в GMT, и вы хотите показать его в локальном часовом поясе пользователя, вы не должны вручную настраивать объекты NSDate/Date. Вы должны просто использовать соответствующие часовые пояса с помощью форматирования. Например, в Swift 3:

let gmtTimeString = "5:00 PM"

let formatter = DateFormatter()
formatter.dateFormat = "h:mm a"
formatter.timeZone = TimeZone(secondsFromGMT: 0)            // original string in GMT
guard let date = formatter.date(from: gmtTimeString) else {
    print("can't convert time string")
    return
}

formatter.timeZone = TimeZone.current                       // go back to user timezone
let localTimeString = formatter.string(from: date)

Или в Swift 2:

let formatter = NSDateFormatter()
formatter.dateFormat = "h:mm a"
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)  // original string in GMT
let date = formatter.dateFromString(gmtTimeString)

formatter.timeZone = NSTimeZone.localTimeZone()        // go back to user timezone
let localTimeString = formatter.stringFromDate(date!)

Ответ 2

Я бы использовал функцию dateByAddingTimeInterval для добавления и вычитания часов. Добавьте a в строку dateFormat для печати am или pm.

var showTimeStr = "00:00 PM" //show time in GMT as String
let formatter = NSDateFormatter()
formatter.dateFormat = "hh:mm a"
let showTime = formatter.dateFromString(showTimeStr)
showTime.dateByAddingTimeInterval(3600) //Add number of hours in seconds, subtract to take away time
showTimeStr = formatter.stringFromDate(showTime)

Ответ 3

Вот мой последний код, в сочетании с ответами b.Morgans. Я считаю, что все это работает сейчас.

let offsetTime = NSTimeInterval(NSTimeZone.localTimeZone().secondsFromGMT)

var showTimeStr = "05:00 PM" //show time in GMT as String
let formatter = NSDateFormatter()
formatter.dateFormat = "h:mm a"
let showTime = formatter.dateFromString(showTimeStr)
let finalTime = showTime?.dateByAddingTimeInterval(offsetTime) //Add number of hours in seconds, subtract to take away time
showTimeStr = formatter.stringFromDate(finalTime!)