Добавление смещения времени в 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!)