3

次を使用して、アプリ内のどこからでもタイムゾーンを任意に設定しようとすると:

[[NSCalendar currentCalendar] setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
NSTimeZone *tz = [[NSCalendar currentCalendar] timeZone];
NSLog(@"%@", tz);

logステートメントの結果は次のとおりです。

America / Los_Angeles(PDT)オフセット-25200(昼光)

(これは私のローカルタイムゾーン、つまり[NSTimeZone systemTimeZone]です)

ただし、NSCalendarのカテゴリ内の機能的に類似したコードは正常に機能します。

[self setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
NSTimeZone *tz = [self timeZone];
NSLog(@"%@", tz);

そして、ログは次のようになります。

アメリカ/ニューヨーク(EDT)オフセット-14400(昼光)

[NSCalendar currentCalendar]のタイムゾーンの設定はどうなりますか?動作は直感に反します。

4

1 に答える 1

7

簡単な答え:+[NSCalendar currentCalendar]同じインスタンスを返さない。と呼ばれる時点で+currentCalendar現在選択されているロケールとタイムゾーンを反映するインスタンスを返すことになっています。考えられる合理的な動作は3つあります。

  • 毎回新しい値を返します。
  • 新しい値返す必要があることを検出しない限り、キャッシュされた値を返します。
  • キャッシュされた値を返し、ロケール/カレンダーの変更に気付いたときにクリアします。

カレンダーの変更は、最初の場合にのみ意味があります。(2番目のケースでは、以前のへ+currentCalendarの呼び出しは同じインスタンスを指します。3番目のケースでは+currentCalendar、ユーザーがロケール/タイムゾーンを変更するまで、すべての呼び出しは同じインスタンスを返します。)

アプリのタイムゾーンを設定する正しい方法はです+[NSTimeZone setDefaultTimeZone:]

于 2012-10-09T02:13:01.740 に答える