Dhruvの答えが正しいとは思わない。実際、問題があるかどうかは明らかではありません。あなたは、何が起こるべきか、および/または何が起こっているのかについての解釈について誤った期待を持っているようです。
NSDate
ある瞬間を表します。この瞬間には、1つの一意の名前はありません。それは、さまざまな場所でさまざまな命名システム(タイムゾーン、カレンダー)の下でさまざまな名前で知られています。その瞬間の文字列表現を生成する必要があるNSDate
そのメソッドを除いて、これのいずれも処理しません。-description
次に、「02-06-2012」のような文字列は、正確な時刻を指定しません。まず第一に、それは時間情報のない単なる日付なのでNSDateFormatter
、デフォルトではその日付の最初の瞬間になります。次に、タイムゾーンを指定しません。暦日の最初の瞬間は、各タイムゾーンで異なる瞬間です。でタイムゾーンを指定する-setTimeZone:
か、文字列自体にタイムゾーン情報が含まれていない限りNSDateFormatter
、解析を要求する日付文字列はすべて現在のタイムゾーンにあると見なされます。
したがって、dateFromString
オブジェクトは、指定された日付の最初の瞬間である2012年2月6日をタイムゾーンで表します。これがあなたが望んでいたことだと思います。ただし、NSDate
ログに記録されたときに自分自身を説明する方法に混乱しました。私が言ったように、NSDate
それが表す瞬間にいくつかの「名前」(文字列表現)を選択する必要があり、どの名前を選択するかはかなり任意です。最近では、UTCでその瞬間が知られている名前を選んでいます。私はあなたの質問に示されたログ出力からあなたがUTC+0100にいることを収集します。そのため、日付は1日前のように見えるかもしれませんが、実際には指定した瞬間と同じです。つまり、「2012-06-01 23:00:00+0000」と「2012-06-0200:00:00 +0100」は、まったく同じ瞬間の2つの同等の名前です。あなたはただではない
NSDate
教訓は、特定のタイムゾーンにあるためにの自己記述に依存するのをやめなければならないということです。本当に、それは文書化されていないので、あなたはそれについて何にも頼る必要はありません。-[NSDate description]
実際、 「オペレーティングシステムのさまざまなリリース間で表現が一定であることが保証されていない」という状態のドキュメント。
Dhruvのソリューションは、タイムゾーンを引き起こし、合意するという理由だけで役立つようです。しかし、それは信頼できません。たとえば、そのバージョンのフレームワークではUTCではなくローカルタイムゾーンを使用しているため、SnowLeopardでは機能しません。NSDateFormatter
-[NSDate description]
-[NSDate description]
ただし、さらに重要なのは、日付文字列の解釈NSDate
から取得するオブジェクトによって表される実際の瞬間を変更することです。NSDateFormatter
文字列がローカルタイムゾーンにあると解釈されるようにしたいという特定の意味を本当に望んでいるのではないかと思います。彼の解決策はあなたの意図を妨げます。
tl; dr:あなたはずっとあなたが望む日付を取得していました。に依存しないでください-[NSDate description]
; Dhruvのソリューションを使用しないでください