2011-03-07 1 views
6

私は愚かですか?今回私は[NSDate date]が現地日時を返したと思っていました。 NSStringformatter/stringFromdate/dateFromStringに何らかの問題が発生した後、私は[NSDate date]が2011-03-06 11:00:00 +0000を返すことに気付きました。これを調べた後、[NSDate date]は生の日付を返します。これは常にGMTです。[NSDate date]は現地の日時を返しますか?

いつも+0000を表示すると、gmtオフセット部分はどのような目的を果たしますか?また、私は[myDateの説明]を理解していません。ドキュメントには、gmtオフセットとdst情報が表示されるはずです。私は[NSDate date]と同じことをします。

今日の日付を取得するために[NSDate date]を使用し、午後2時以降、私は-10タイムゾーンにあるように明日の日付を取得します。私がNSDateformatterで今日遭遇した問題については言うまでもない。

これは正しく表示されていますか?面白いのは、[NSDate date]が2011-03-06 11:00:00 -36000に戻ることを覚えているようだか、私は2011-03-06 11:00:00 -10000を見ていたと思いましたか?

私はそれを扱うことができますが、誰かがこれを解説してNSDateの理解を深めるのに役立つかもしれません。

+1

'+ [NSDate日付]は'日付オブジェクトを返しますオートリリースされ、現在の時刻を持ちます。それが ' - [NSDate description]'と同じように現れる理由は 'NSLog'は'%@ 'が使われているときにオブジェクトの' description'プロパティを使います。 –

+0

@RadekSこれは答えになるはずです。それが原因です。 :) – Alex

+0

@アレックス部分回答。 –

答えて

20

NSDateは現在の日付を返します。 NSDateは、異なるロケール/タイムゾーンで文字列形式に変換できますが、タイムゾーンの内部概念はありません。 NSDatesは特定の領域に束縛されていません。あなたと他の誰かがあなたのデバイスに[NSDate date]を同時に要求しても、結果は常にGMTで返されるのではなく、タイムゾーン固有の方法で返されないため、同じ結果が得られます。ココアでは、日付は地球の歴史の特定の瞬間です。日付の書き方は、カレンダー、タイムゾーン、ロケールに関連しています。

あなたは明日の日付を取得していません。あなたは正しい日付を取得していて、GMTで表現されていれば別の日になります。それはあなたが望むものとは違った、ちょうど正しい日付です。

'description'はNSObjectからオーバーライドされたメソッドです。オブジェクトをNSLogすると、内部的にはdescriptionメソッドが呼び出され、返された文字列が出力されます。前者はdescriptionを呼び出してその文字列を出力し、後者はdescriptionを呼び出して結果の文字列のdescriptionを呼び出し、それを印刷するので、object[object description]のログからは同じ結果が得られるはずです。 NSStringsは、記述の結果として自分自身を返します。

これはデフォルトの動作でなければなりませんが、わかりやすい説明を取得するには、試してみてください。

NSLog(@"%@", [[NSDate date] descriptionWithCalendarFormat:nil 
      timeZone:[NSTimeZone localTimeZone] locale:[NSLocale currentLocale]]); 

それはまだGMTにログインする場合は、お使いのデバイスがGMTであることを自分自身を信じています。私はシミュレータがそのようなことについてどれほど信頼できるか分かりません。 スウィフト

+0

トミー、ありがとう。それはとても役に立ちました。明日の日付を与えるそれについてのあなたの声明に関して。私はあなたの意見を見ますが、私にとって私は私のタイムゾーン(現地の日時)で日付を取得することを期待していたので、明日の日付です。私はこれがセマンティクスの単なるケースだと思うが、GMTがゼロタイムゾーンであるため、[NSDate date]はGMTを返さない。素晴らしい答え - ありがとう。 – user278859

+0

もう一度質問にお答えしますか?私はドキュメントが[NSTimeZone localTimeZone]について何を言っているのか理解できない。 「現在のアプリケーションのデフォルトのタイムゾーンにすべてのメッセージを転送するオブジェクトを返します」と表示されます。どういう意味ですか。私にとって、それは何とかそれを呼び出すことは、その後の日付や時間の操作に影響することを意味します。ありがとう。 – user278859

+0

私は、ちょっと丸い言葉遣いは、localTimeZoneによって返されたオブジェクトが、タイムゾーンが変更されても意味的に正しいままであるのに対して、defaultTimeZoneは変更されないからです。したがって、最初のオブジェクトは自動的に更新されるように見えますが、2番目のオブジェクトは自動的に更新されません。内部的には間接的なレベルの間接的なものですが、そこでの実装についてもっと知っておくべきであると感じたようです。 – Tommy

-1

NSDate()は私たちに依存しない日付の説明を与え、それは常に独立して、デバイスのタイムゾーンの、UTC + 0日付時刻を返します。

print(NSDate()) 

.descriptionWithLocale(NSLocale.currentLocale())!は私達UTC + 0と現在のローカル日付時刻とNオフセット(正または負)を表すローカライズされた日付の説明UTC + N日時を与える:

print(NSDate().descriptionWithLocale(NSLocale.currentLocale())!) 
+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 –

+0

私は現在NSDateで働いていますので、私は徐々に答えと説明を改善します。 –

+0

'NSDate'にはタイムゾーンがありません。 UTC + 0ではありません。 – Sulthan

関連する問題