Как получить переход на летнее время с помощью pod TimeZoneLocate в Swift - PullRequest
0 голосов
/ 19 апреля 2019

Я конвертирую местный часовой пояс в строку, чтобы отобразить его на экране.Для этого я использую библиотеку TimeZoneLocate.Проблема: я получаю результат даты на один час меньше, чем из-за отсутствия перехода на летнее время.

Я получаю JSON с sunrise-sunset.org и использую следующие строки: sunrise = "3:22:31 AM";закат = "5:23:25 вечера".

Я думал об использовании функции isDaylightSavingTime() с оператором if, но не могу понять, где добавить этот час.

Это функция, где происходит волшебство:

func UTCToLocal(incomingFormat: String, outgoingFormat: String, location: CLLocation?) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = incomingFormat
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

    let dt = dateFormatter.date(from: self)
    let timeZone = location?.timeZone ?? TimeZone.current

    dateFormatter.timeZone = timeZone
    dateFormatter.dateFormat = outgoingFormat

    return dateFormatter.string(from: dt ?? Date())
}

Я использую локальное "местоположение" из CLLocation, TimeZone.current предоставляется библиотекой TimeZoneLocate.

Этокак я использую его в коде:

func parce(json: Data, location: CLLocation) {
    let decoder = JSONDecoder() 
if let sunriseData = try? decoder.decode(Results.self, from: json) {

self.sunriseLbl.text = sunriseData.results?.sunrise.UTCToLocal(incomingFormat: "h:mm:ss a",
outgoingFormat: "HH:mm",
location: location)

sunriseLbl печатает данные восхода солнца из JSON для текущего местоположения по умолчанию и для любого места с помощью GooglePlaces.Но в обоих случаях я получаю неправильную дату.

Кроме того, вот ссылка на мой проект на GitHub, если он может помочь вам помочь мне: https://github.com/ArtemBurdak/Sunrise-Sunset.

Спасибо взаранее

1 Ответ

0 голосов
/ 19 апреля 2019

Интересная вещь, которую я заметил: TimeZone.current - это , возвращающий правильный часовой пояс, но location?.timeZone не , возвращающий правильный часовой пояс.Если есть способ реализовать TimeZone.current, то есть приложение всегда будет использовать текущее местоположение пользователя, то я бы посоветовал использовать это.Однако, если пользователи могут ввести пользовательское местоположение, вам нужно получить обходной путь для явно неправильного часового пояса, возвращенного location?.timeZone.

Мой обходной путь заключается в следующем.Обратите внимание, что мы вручную настраиваем местоположение нужного часового пояса, изменяя свойство .secondsFromGMT().Вот как я изменил ваш код, и он возвращал правильный часовой пояс для моего личного местоположения.

extension String {
    func UTCToLocal(incomingFormat: String, outgoingFormat: String, location: CLLocation?) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = incomingFormat
        dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

        let dt = dateFormatter.date(from: self)

        var timeZone = location?.timeZone ?? TimeZone.current

        if timeZone.isDaylightSavingTime() {
            timeZone = TimeZone(secondsFromGMT: timeZone.secondsFromGMT() - 7200)!
        }
        dateFormatter.timeZone = timeZone
        dateFormatter.dateFormat = outgoingFormat

        let output = dateFormatter.string(from: dt ?? Date())

        return output
    }
}

ПРИМЕЧАНИЕ: Часовые пояса очень сложны и меняются с места на место ис текущего времени года.То, что этот обходной путь работает для моего текущего местоположения в текущий день, не означает, что этот обходной путь всегда работает. Однако, , вы можете посмотреть возвращаемое значение timeZone.isDaylightSavingTime(), а также текущее местоположение, чтобы создать новый часовой пояс с помощью timeZone = TimeZone(secondsFromGMT: timeZone.secondsFromGMT() - x при необходимости.Таким способом вы можете реализовать

"Я думал об использовании функции isDaylightSavingTime () с оператором if, но я не могу понять, где добавить этот час."

идея, которая у вас была.

РЕДАКТИРОВАТЬ: Для записи, часовой пояс, который я использовал, был CST, или чикагское время.Дата, когда я написал этот код, была 19 апреля 2019 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...