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