В чем разница между следующими часовыми поясами в Swift

let timeZone = NSTimeZone.system.description
let localTimeZone = TimeZone.ReferenceType.local.description
let currentTimeZone = TimeZone.current.description
let defaultTimeZone = TimeZone.ReferenceType.default.description
let autoUpdateTimezon = TimeZone.autoupdatingCurrent.description

print ("System Timezone \(timeZone)")
print ("Local Timezone \(localTimeZone)")
print ("Current Timezone \(currentTimeZone)")
print ("Default Timezone \(defaultTimeZone)")
print ("Auto updating Timezone \(autoUpdateTimezon)")

ВЫВОД

Системный часовой пояс Азия/Калькутта (текущий)

Местный часовой пояс Азия/Калькутта (autoupdatingCurrent)

Текущий часовой пояс Asia/Kolkata (текущий)

Часовой пояс по умолчанию Азия/Калькутта (текущий)

Автоматическое обновление часового пояса Азия/Калькутта (autoupdatingCurrent)

Итак, я получаю, что все выходные данные одинаковы, так в чем разница между этими часовыми поясами и какой часовой пояс мы должны использовать в каком случае.

Проблема

Я использовал следующий код для преобразования даты

static func stringToString(strDate:String, fromFormat:String, toFormat:String)->String{
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC") ?? TimeZone(identifier: "UTC") ?? TimeZone.ReferenceType.default
        dateFormatter.dateFormat = fromFormat
        let currentDate = dateFormatter.date(from: strDate) ?? Date()
        dateFormatter.dateFormat =  toFormat
        dateFormatter.timeZone = TimeZone.ReferenceType.default
        let currentDates = dateFormatter.string(from: currentDate)
        return currentDates
    }

Сцена: Мое приложение дает сбой в Катаре, если пользователь автоматически устанавливает часовой пояс и off the 24 hours, но в Индии сбоя нет (TimeZone.ReferenceType.local)

Я дал следующую сборку с TimeZone.ReferenceType.default и проблема решена

Так и не могу понять в чем дело.

Отчет о сбое

введите здесь описание изображения

Старый код, в котором я получаю сбой

введите здесь описание изображения


person Jaydeep Vyas    schedule 27.03.2018    source источник
comment
Возможный дубликат NSTimeZone: в чем разница между localTimeZone и systemTimeZone?   -  person Prashant Tukadiya    schedule 27.03.2018


Ответы (2)


Local -> Объект, отслеживающий текущий системный часовой пояс. Используйте это свойство, если вам нужен объект, который всегда отражает текущий системный часовой пояс. начиная с iOS 11 свойство локального класса отражает текущий часовой пояс системы, тогда как ранее оно отражало часовой пояс по умолчанию.

Система -> Часовой пояс, используемый в настоящее время системой. Если вы обращаетесь к свойству системного класса, его значение кэшируется приложением и не обновляется, если пользователь впоследствии изменит системный часовой пояс. Чтобы системное свойство отражало новый часовой пояс, необходимо сначала вызвать метод resetSystemTimeZone() для очистки кэшированного значения.

По умолчанию -> часовой пояс по умолчанию для текущего приложения. Если часовой пояс по умолчанию не установлен, используется текущий системный часовой пояс. Если текущий часовой пояс системы не может быть определен, вместо него используется часовой пояс GMT. Часовой пояс по умолчанию используется приложением для операций с датой и временем. Вы можете настроить его так, чтобы приложение работало так, как будто оно находится в другом часовом поясе.

Текущий -> Часовой пояс, используемый в настоящее время системой.

autoupdatingCurrent -> Часовой пояс, используемый в настоящее время системой, автоматически обновляется в соответствии с текущими предпочтениями пользователя.

Источник -> https://developer.apple.com/documentation/foundation/nstimezone

person dahiya_boy    schedule 27.03.2018

Обратите внимание, что TimeZone.ReferenceType в основном NSTimeZone.

Если вы посмотрите на документы для TimeZone и NSTimeZone вы узнаете очень быстро.

Из NSTimeZone:

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

Подводя итог, system кэшируется, поэтому не изменится, когда пользователь изменит свой часовой пояс. Вы должны позвонить resetSystemTimeZone, чтобы обновить его. local, с другой стороны, автоматически обновляется, когда пользователь меняет свой часовой пояс.

То же самое верно и для TimeZone:

TimeZone предоставляет две статические функции для получения значений часового пояса: current и autoupdatingCurrent. Часовой пояс autoupdatingCurrent автоматически отслеживает обновления, сделанные пользователем.

current соответствует system, а autoupdatingCurrent соответствует local.

person Sweeper    schedule 27.03.2018
comment
поскольку проблема решена, но я не могу воспроизвести проблему в Индии, даже если я изменил часовой пояс своего устройства на Доха-Катар, регион - кватар, но не могу получить сбой в Индии, но в Катаре клиент получит сбой, если он выключит 24 часа - person Jaydeep Vyas; 27.03.2018
comment
@JaydeepVyas Вы заменили что на NSTimeZone.default? - person Sweeper; 27.03.2018
comment
Сначала я использую TimeZone.ReferenceType.local, а затем заменяю его на TimeZone.ReferenceType.default. - person Jaydeep Vyas; 27.03.2018
comment
@JaydeepVyas Можно установить часовой пояс default. Ваше приложение будет работать в этом часовом поясе. Вы его где-нибудь ставили? Если нет, то он должен быть таким же, как system. - person Sweeper; 27.03.2018
comment
да, я знаю это, но мой клиент в Катаре столкнулся со сбоем, если он отключил настройку 24 часа в своем телефоне, я тестирую в Индии, даже если я отключил 24 часа. не сбой - person Jaydeep Vyas; 27.03.2018
comment
но после предоставления ему следующей сборки с часовым поясом по умолчанию проблема решена, поэтому мне интересно, где существует реальная проблема - person Jaydeep Vyas; 27.03.2018
comment
я конвертирую то же самое с местным часовым поясом, и другие расчеты выполняются на основе этого - person Jaydeep Vyas; 27.03.2018