Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top