Интересная вещь, которую я заметил: 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 года.