iPhone - Diferenças entre métodos de conveniência de fuso horário
-
12-11-2019 - |
Pergunta
eu vejo isso NSTimeZone
tem estes métodos:
defaultTimeZone
localTimeZone
systemTimeZone
Alguém pode me explicar, em termos simples, quais são as diferenças entre essas chamadas e quando uma deve ser usada em vez da outra?Não entendo nada nos documentos da Apple sobre isso.
Solução
A linguagem nos documentos é um pouco seca, com certeza, e a semelhança dos nomes é potencialmente confusa.vou citar o NSTimeZone
documentos aqui e tente explicá-los:
systemTimeZone
O fuso horário atualmente usado pelo sistema.Se o fuso horário atual não puder ser determinado, retornará o fuso horário GMT.
Este é o fuso horário em que o dispositivo acredita estar;geralmente é definido automaticamente e corresponderia à localização física do dispositivo, mas se o usuário tiver definido explicitamente um fuso horário específico no aplicativo Configurações, é isso que você obterá.
defaultTimeZone
O fuso horário padrão do aplicativo atual.Se nenhum fuso horário padrão tiver sido definido, este método invocasystemTimeZone
e retorna o fuso horário do sistema.
Seu aplicativo tem permissão para definir seu próprio fuso horário, para que você possa executar ações como se o dispositivo estivesse em outro fuso horário, mas sem afetar o fuso horário do sistema (e, portanto, de outros aplicativos).A configuração é realizada com uma chamada para setDefaultTimeZone:
.Se você ainda não fez isso, esta chamada é idêntica a ligar systemTimeZone
.
localTimeZone
Um objeto que encaminha todas as mensagens para o fuso horário padrão do aplicativo atual.O fuso horário local representa o estado atual do fuso horário padrão em todos os momentos.
É aqui que fica um pouco complicado. localTimeZone
fornece quase o mesmo resultado que defaultTimeZone
.A diferença é que o específico NSTimeZone
exemplo você obtém de localTimeZone
sempre refletirá a configuração que você fez para o fuso horário no seu aplicativo.Você pode chamá-lo uma vez, salvar o resultado e sempre obter o fuso horário simulado atual por meio desse objeto, independentemente das alterações feitas.É como se, quando você usa isso NSTimeZone
por exemplo, a estrutura está chamando defaultTimeZone
para você, para ter certeza de que sempre obterá o valor atual.
Aqui estão algumas breves ilustrações do que foi dito acima.O NSTimeZone
objeto do qual você volta systemTimeZone
representa o fuso horário do sistema no momento em que você faz a chamada.Se você ligar systemTimeZone
novamente, mesmo que o usuário tenha alterado o fuso horário, você obterá o mesmo.Seu aplicativo armazena esse valor em cache e você precisa solicitar ao sistema para limpá-lo com resetSystemTimeZone
para obter a atualização.
// 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
Algo semelhante acontece com defaultTimeZone
.Ao chamar esse método, você obtém um objeto que sempre representará o mesmo fuso horário, mesmo que você chame posteriormente setDefaultTimeZone:
.No entanto, se você usar o objeto obtido de localTimeZone
, ele seguirá a alteração feita no fuso horário padrão*.
// 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!
A Apple parece recomendo usar localTimeZone
:
com o método da classe localTimeZone, você pode obter um objeto de fuso horário relativo que se decodifica para se tornar o fuso horário padrão em qualquer computador em que se encontre.
*Observe que localTimeZone
ainda está sujeito ao cache no nível do aplicativo do fuso horário do sistema.Ele só muda para seguir sua configuração do padrão fuso horário.