Подтвердить что ты не робот

IPhone - Различия между удобными методами часовых поясов

Я вижу, что NSTimeZone имеет следующие методы:

defaultTimeZone  
localTimeZone  
systemTimeZone

Может кто-нибудь объяснить мне, простыми словами, какие различия между этими вызовами, и когда нужно использовать вместо другого? Я ничего не понимаю в документах Apple об этом.

4b9b3361

Ответ 1

Язык в документах, конечно, немного на сухой стороне, и сходство имен потенциально сбивает с толку. Я приведу здесь NSTimeZone docs и попробую объяснить их:

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 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 по-прежнему зависит от кеша уровня приложения в системном часовом поясе. Он изменяется только в соответствии с настройками часового пояса по умолчанию.