質問

私はそれを見る 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!

アップルはどうやら 使用をお勧めします localTimeZone:

localTimeZone クラス メソッドを使用すると、相対タイム ゾーン オブジェクトを取得できます。このオブジェクトは、それ自体をデコードして、それが存在するコンピュータ上のデフォルトのタイム ゾーンになります。


*ご了承ください localTimeZone システムのタイムゾーンのアプリレベルのキャッシュの影響を受けます。の設定に従ってのみ変更されます。 デフォルト タイムゾーン。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top