2014-12-23 2 views
15

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

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

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

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

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

Кит

ответ

18

Если вы хотите, чтобы преобразовать время шоу, которое хранится в виде строки по Гринвичу, и вы хотите, чтобы показать его в местном часовом поясе пользователя, вы должны не вручную регулировать объекты 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'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!) 
+0

«вы не должны вручную настраивать объекты NSDate» - золото! – TruMan1

4

Я хотел бы использовать функцию 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) 
+1

Спасибо за ответ. То, что вы положили, в значительной степени работает, мне нужно было просто добавить дополнительные опции. Теперь я пытаюсь установить смещение, где у вас есть 3600 let offsetTime = NSTimeZone.localTimeZone(). SecondsFromGMT, но я получаю «Int не конвертируется в NSTimeInterval», есть ли способ сделать это? – user3712837

+0

Спасибо. Пожалуйста, поддержите и выберите правильный ответ, если он сработает. Чтобы сделать: 'let offsetTime = Int (NSTimeZone.localTimeZome(). SecondsFromGMT)'. Выполнение этого будет работать, но поймите, что он усечет интервал (т. Е. 83.96748 станет 83, а не 84). Если вы хотите округлить, то бросьте, то ответ на этот пост: http://stackoverflow.com/questions/11121459/how-to-convert-nstimeinterval-to-int поможет вам. –

+0

На самом деле это только вычитает его 7 минут, и эта ссылка не работает в swift, если я не ошибаюсь. – user3712837

1

Вот мой последний код, в сочетании с ответами 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!) 
+1

Вы часто получаете правильный результат таким образом, но это противоречит фундаментальному непониманию ' NSDate'. Например, с этим кодом переменная 'showTime' не 5pm GMT, а скорее 5 вечера в вашем локальном часовом поясе (для меня в Нью-Йорке, 5 вечера - 10 вечера по Гринвичу). Конечно, в' finalTime' вы меняете эту ошибку, заменив 10pm GMT на 5pm GMT, и когда вы затем используете форматтер, чтобы снова отобразить это как строку, вы получите правильное показание в 5pm GMT в вашем локальном часовом поясе (т.е.полдень здесь, в Нью-Йорке). Это излишне сбивает с толку (и если вы начнете использовать полные строки даты, иногда вы будете отключены на 24 часа). – Rob

+0

Спасибо, тонна Роба, это имеет смысл, и я хочу сделать это правильно и избежать путаницы. – user3712837

+0

Да, на самом деле я тоже использую дату. У меня в основном есть отдельное поле в базе данных для времени и отдельного поля даты, т.е. 2014-01-01. Но, возможно, я должен использовать оба одновременно, и я настраиваю содержимое базы данных, но мне нужно, чтобы я также мог настроить форматирование раньше. Так что да, в основном, что работает лучше всего, и в конце концов мне нужна дата как один ярлык и время как другое в приложении. Благодарю. – user3712837

Смежные вопросы