Дата UIDatePicker для iOS и теперь дата рано 8 часов - PullRequest
0 голосов
/ 24 мая 2018

Есть мои коды, я имел дело с часовым поясом, и теперь время от средства выбора даты правильное, но время, отображаемое на устройстве выбора даты, все еще неверно, и текущее время, полученное с помощью Date(), также неверно.

 @IBAction func dateChanged(_ datePicker: UIDatePicker) {
            let timeZone = NSTimeZone.system
            let interval = timeZone.secondsFromGMT(for: datePicker.date)

            let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .timeZone], from: datePicker.date.addingTimeInterval(TimeInterval(interval)))
            remindDate = Calendar.current.date(from: dateComponents)!

            print("+++++++++++++DatePicker: \(datePicker.date)++++++++++++++Date: \(remindDate)++++++++++++++Now: \(Date())+++++++++++++")

            updateDateDetial(remindDate)

        }

Вот результат print():

+++++++++++++ DatePicker: 2018-05-25 02: 44: 33 +0000 ++++++++++++++ Дата: 2018-05-25 10:44:00 +0000 ++++++++++++++ Сейчас:2018-05-24 00:44:38 +0000 +++++++++++++

Время, которое я выбрал для выбора даты, - 2018-05-25 10:44.Время должно быть 2018-05-24 8:44:38.Однако в программе все еще есть разрыв со временем.

1 Ответ

0 голосов
/ 24 мая 2018

Этот код, который добавляет смещение временного интервала от GMT, неверно.Не делай этого.

Проблема, с которой вы сталкиваетесь, заключается в том, что по умолчанию даты отображаются в формате GMT ​​(UTC).Вы можете использовать метод класса DateFormatter localizedDate, чтобы получить строку даты в текущей локали.

let datePickerDateString = DateFormatter.localizedString(from: datePicker.date,
  dateStyle: .medium,
  timeStyle, .medium)
let remindDateString = DateFormatter.localizedString(from: remindDate,
  dateStyle: .medium,
  timeStyle, .medium)
let nowString = DateFormatter.localizedString(from: Date(),
  dateStyle: .medium,
  timeStyle, .medium)
print("+++++++++++++DatePicker: \(datePickerDateString)++++++++++++++Date: \(remindDateString)++++++++++++++Now: \(nowString)+++++++++++++")

Я создал простое расширение класса Date, которое делает это намного проще:

extension Date {
    func localString(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String {
        return DateFormatter.localizedString(from: self, dateStyle: dateStyle, timeStyle: timeStyle)
    }
}

Это сворачивает ваш код до:

        print("+++++++++++++DatePicker: \(datePicker.date.localString())" + 
              "++++++++++++++Date: \(remindDate.localString())" + 
              "++++++++++++++Now: \(Date().localString())+++++++++++++")

РЕДАКТИРОВАТЬ

Если вы устанавливаете дату выбора даты в метку, код может выглядеть следующим образом (при использовании Date расширение выше)

myLabel.text = datePicker.date.localString()

(хотя учтите, что вам действительно следует сохранять дату в переменной экземпляра, когда пользователь изменяет ее, а не извлекать ее из средства выбора даты. Сохранение данных модели в объектах представления - это кодзапах.)

...