web-dev-qa-db-ja.com

iPhone-タイムゾーンの便利な方法の違い

NSTimeZoneには次のメソッドがあることがわかります。

defaultTimeZone  
localTimeZone  
systemTimeZone

誰かが私に簡単な言葉で、それらの呼び出しの違いは何か、そして一方を他方の代わりに使用する必要がある場合を説明できますか? Appleドキュメント内でこれについて何も理解していません。

50
Oliver

確かに、ドキュメントの言語は少し乾燥した側にあり、名前の類似性は潜在的に混乱を招きます。ここで 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'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は、引き続きシステムタイムゾーンのアプリレベルのキャッシュの対象となることに注意してください。 defaultタイムゾーンの設定に従うようにのみ変更されます。

73
Josh Caswell