iPhone – различия в методах удобства часовых поясов
-
12-11-2019 - |
Вопрос
я вижу это NSTimeZone
имеет эти методы:
defaultTimeZone
localTimeZone
systemTimeZone
Может ли кто-нибудь объяснить мне простыми словами, в чем разница между этими вызовами и когда один из них следует использовать вместо другого?Я ничего не понимаю в документах Apple по этому поводу.
Решение
Конечно, язык в документации немного суховат, а сходство названий потенциально может сбить с толку.Я процитирую NSTimeZone
документы вот и попытайтесь их объяснить:
systemTimeZone
Часовой пояс, используемый системой в данный момент.Если текущий часовой пояс не может быть определен, возвращается часовой пояс GMT.
Это часовой пояс, в котором, по мнению устройства, оно находится;он часто устанавливается автоматически и затем соответствует физическому местоположению устройства, но если пользователь явно установил определенный часовой пояс в приложении «Настройки», вы получите именно это.
defaultTimeZone
Часовой пояс по умолчанию для текущего приложения.Если часовой пояс по умолчанию не установлен, этот метод вызываетsystemTimeZone
и возвращает системный часовой пояс.
Вашему приложению разрешено устанавливать собственный часовой пояс, чтобы вы могли выполнять действия, как если бы устройство находилось в другом поясе, но не затрагивая часовой пояс системы (и, следовательно, других приложений).Настройка осуществляется вызовом setDefaultTimeZone:
.Если вы этого не сделали, этот вызов идентичен вызову systemTimeZone
.
localTimeZone
Объект, который пересылает все сообщения в часовой пояс по умолчанию для текущего приложения.Местный часовой пояс представляет текущее состояние часового пояса по умолчанию в любое время.
Здесь все становится немного сложнее. localTimeZone
дает почти тот же результат, что и defaultTimeZone
.Разница в том, что конкретный NSTimeZone
экземпляр, который вы получаете от localTimeZone
всегда будет отражать настройки часового пояса, установленные вами в вашем приложении.Вы можете вызвать его один раз, сохранить результат и всегда получать текущий моделируемый часовой пояс через этот объект, независимо от внесенных изменений.Это как если бы вы использовали это NSTimeZone
например, фреймворк вызывает defaultTimeZone
для вас, чтобы быть уверенным, что вы всегда получаете текущее значение.
Вот пара кратких иллюстраций к вышесказанному.А NSTimeZone
объект, от которого вы получаете обратно systemTimeZone
представляет часовой пояс системы во время звонка.Если вы позвоните systemTimeZone
опять же, даже если пользователь с тех пор сменил часовой пояс, вы получите тот же самый.Ваше приложение кэширует это значение, и вам нужно попросить систему очистить его с помощью resetSystemTimeZone
чтобы получить обновление.
// Say that device is in GMT originally
NSLog(@"%@", [NSTimeZone systemTimeZone]); // GMT
// User flies into Rome and iPhone changes the zone automatically
NSLog(@"%@", [NSTimeZone systemTimeZone]); // Still GMT
[NSTimeZone resetSystemTimeZone]; // Clear app's cache
NSLog(@"%@", [NSTimeZone systemTimeZone]); // Now GMT+2
Подобное происходит и с defaultTimeZone
.Когда вы вызываете этот метод, вы получаете объект, который всегда будет представлять один и тот же часовой пояс, даже если вы позже вызовете setDefaultTimeZone:
.Однако если вы используете объект, полученный из localTimeZone
, оно будет соответствовать изменению часового пояса по умолчанию*.
// Say that defaultTimeZone is originally GMT
NSTimeZone * myDefaultTZ = [NSTimeZone defaultTimeZone];
NSTimeZone * myLocalTZ = [NSTimeZone localTimeZone];
[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Etc/GMT-4"]];
NSLog(@"%@", myDefaultTZ); // Still gives GMT
NSLog(@"%@", [NSTimeZone defaultTimeZone]); // GMT-4, the new value
NSLog(@"%@", myLocalTZ); // Also the new value!
Apple, похоже, рекомендую использовать localTimeZone
:
с помощью метода класса localTimeZone вы можете получить объект относительного часового пояса, который декодирует себя и становится часовым поясом по умолчанию на любом компьютере, на котором он находится.
*Обратите внимание, что localTimeZone
по-прежнему подчиняется кэшу уровня приложения системного часового пояса.Он меняется только в соответствии с вашими настройками по умолчанию часовой пояс.