Установить часовой пояс в 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 шт):

Автор решения: schmidt9

Пикер возвращает дату без часового пояса (так как 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)
}
→ Ссылка