Установить часовой пояс в UIDatePicker
Всем привет!
Изучаю iOS разработку и добрался до UIDatePicker. Столкнулся с такой проблемой, что при выборе, время не соответствует локальному, а точнее моему часовому поясу.
Например, у меня на компьютере стоит время 16.06.2020 12:00, а когда я выбираю в datapicker 13:00, то он возвращает время 2020-06-16 06:00:00 +0000, что, собственно, не соответствует реальному. Я понял, что это из-за некорректного часового пояса. Пытался установить часовой пояс вручную через datePicker.timeZone, но никакого эффекта это не дает.
Подскажите, как правильно установить часовой пояс Asia/Novosibirsk?
Вот мой код:
import UIKit
class ViewController: UIViewController {
let datePicker = UIDatePicker()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
datePicker.center = view.center
datePicker.locale = NSLocale(localeIdentifier: "ru_RU") as Locale
datePicker.timeZone = NSTimeZone.init(name: "Asia/Novosibirsk") as TimeZone?
datePicker.addTarget(self, action: #selector(selectedDateTime(target:)), for: .valueChanged)
view.addSubview(datePicker)
}
@objc func selectedDateTime(target: UIDatePicker) {
print(target.date)
}
}
Ответы (1 шт):
Пикер возвращает дату без часового пояса (так как Date содержит только время в UTC 0), присвоение datePicker.timeZone означает в каком часовом поясе будет отображаться дата (datePicker.date) в самом пикере
Для отображения возвращаемой даты в selectedDateTime нужно привести ее к нужному часовому поясу, например здесь 2 варианта: добавить смещение часового пояса к самой дате, получив абсолютное время, или сконструировать DateComponents - зависит от задачи
@objc func selectedDateTime(target: UIDatePicker) {
let date = target.date
guard let timeZone = TimeZone(identifier: "Asia/Novosibirsk") else { // или взять пояс из пикера
return
}
// absolute time
let utcOffset = timeZone.secondsFromGMT(for: date)
let absoluteDate = date.addingTimeInterval(TimeInterval(utcOffset))
print(absoluteDate)
// calendar components
let calendar = Calendar.autoupdatingCurrent
let comps = calendar.dateComponents(in: timeZone, from: date)
print(comps)
}