iPhone - различия между удобными методами часовых поясов - PullRequest
50 голосов
/ 13 мая 2011

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

defaultTimeZone  
localTimeZone  
systemTimeZone

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

1 Ответ

73 голосов
/ 13 мая 2011

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

...