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

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

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

NSTimeZone.localTimeZone().secondsFromGMT / 60 / 60

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

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

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

затем я создаю строку с даты для использования в метке, чтобы ее было легко читать с помощью AM / ПОСЛЕ ПОЛУДНЯ.

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

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

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

Кит

3 ответов


если вы хотите преобразовать время показа, которое хранится в виде строки в GMT, и вы хотите показать его в локальном часовом поясе пользователя, вы должны не вручную регулировать NSDate/Date объекты. Вы должны просто использовать соответствующие часовые пояса с formatter. Например, в 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's 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's timezone
let localTimeString = formatter.stringFromDate(date!)

Я бы использовал 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)

вот мой окончательный код в сочетании с b.Морганы отвечают. Думаю, теперь все работает.

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!)