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