日付が2010-08-23 13:30:00 -0400あり、UTC+2タイムゾーンで取得しようとしています。秒単位の差は21600ですが、電話をかけると[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];、2010-08-24 01:30:00 +0200どちらがであるかがわかります2010-08-23 19:30:00 +0200。私が間違っていることについて何か考えはありますか?
2 に答える
日付オブジェクトは、その時点でさまざまな人の時計が何を言っていたかに関係なく、特定の瞬間を表します。
日付を表示する場合は、通常、ユーザーの時計がその時点で言っていた(または言っている、または言う)内容を表示するため、タイムゾーンが関係します。これは、NSDateの場合に発生することですNSLog。日付の説明は、ローカルタイムゾーンで表されるその瞬間です。
NSDateへの加算またはNSDateからの減算は、タイムゾーン変換ではありません。加算と減算により、他の瞬間を表すNSDateが生成されます。あなたの場合、あなたは、地球の反対側で同じ瞬間ではなく、あなたが始めた瞬間から6時間後の瞬間にNSDateを作成しています。
簡単にするために、タイムゾーン変換は空間内のさまざまなポイント(惑星の表面のさまざまなセクション)で同時に見ていますが、日付の加算と減算はさまざまな時間を計算しています。
NSDateはそもそもタイムゾーンに含まれていないため、NSDateのタイムゾーン変換はありません。タイムゾーンは、そのタイムゾーンの日付をフォーマットするときにのみ関係します。したがって、その日付を他のタイムゾーンで表示するには、それを実行します。通常、これは、希望するタイムゾーンを日付フォーマッタに提供することを意味します。
戻ってきた日付のタイムゾーンは異なり+200ます-400。気付いた場合、その結果は元の日付よりも正確に12時間(または6時間+ 6時間)遅れていることがわかります。新しい日付を作成したときに、偶然にもロケールも変更しましたか?システムが補正する時間を自動的に調整する+200代わりに、あなたに与え始めた変更を加えたとき、あなたは日付にさらに6時間を追加しました。-400NSDateは、2001年1月1日GMT以降のすべての日付を時間間隔として保存し、必要に応じてタイムゾーンを調整します。