2012-01-15 13 views
15

NSStringオブジェクトからNSDateオブジェクトを目的関数-cで初期化する必要があります。私はこのようにそれを行う:私のタイムゾーンがNSDateに保存されないのはなぜですか?

NSString *dateString = [[webSentence child:@"DateTime"].text stringByReplacingOccurrencesOfString:@"T" withString:@" "]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-mm-dd HH:mm:ss"]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Budapest"]]; 

NSDate *date = [[NSDate alloc] init]; 
date = [dateFormatter dateFromString:dateString]; 

例:私は文字列値でそれをしようとすると、@「2011-01-02夜05時49分54秒は、」私が手NSDate 2011-01-02午後4時49分54秒+ 0000。あなたが見ることができるように、2つの値の間に1時間の違いがあります。 NSDateは間違った値を持っています。これはdateFormatterで設定したタイムゾーンの文字列で定義したものとまったく同じにする必要があります。タイムゾーンを "ヨーロッパ/ブダペスト"に設定しても、それは私の日付を文字列をUTCとして定義しているようです。この問題を解決するにはどうすればよいですか?

ありがとうございます!

答えて

14

2つのもの:

1)日付書式文字列にエラーがあります。あなたはあなたのNSDateオブジェクトを作成した後、あなたが特定のタイムゾーンにローカライズされた日付文字列を生成するNSDateFormatterメソッドstringFromDate:を使用する必要があります(小文字mmは分です)

2)ないmm、月のMMを使用する必要があります。 NSDateオブジェクトに対してまっすぐなNSLog()を実行すると、デフォルトでGMTとして表示されます(GMTはブダペスト時間より1時間遅い)。

+0

ありがとうございました! – Tom

+0

これは、私がタイムゾーンを持っていれば、そのタイムゾーンでNSDateオブジェクトに日付を保存できないということですか?私はタイムゾーンを保存しなければならないだろうどこに表示しながらユーザーですか? – Nil

27

NSDateは標準参照日付を基準に日付を格納します。クラスから:

"NSDateの唯一のプリミティブメソッドtimeIntervalSinceReferenceDateは、NSDateインターフェイスの他のすべてのメソッドの基礎を提供します。このメソッドは、絶対参照日付に関連する時間値を返します。 2001年1月、GMT。

NSDate自体にタイムゾーンの概念はありません。だから、NSDateFormatterは正しいことをしました。それはGMTオフセット(タイムゾーンを指定することによって)を持っていると言った日付を変換し、その日の "正規化された" NSDateを与えました。

あなたは、例えば-descriptionWithCalendarFormat(ヨーロッパ/ブダペストタイムゾーンで表される日付を参照して、いずれかの既存の日付フォーマッタ(-stringFromDate :)または適切なNSDateの記述方法を使用する場合:タイムゾーン:ロケール:)。

P.S.-書かれているように、コード内にalloc/initはまったく必要ありません。非ARCの場合、これはリークです。

P.P.S.-あなたの日付形式が正しくなく、無意味な結果が得られます。私は先に進み、以下のようにコードを整理しました(ARCでテスト済み):

NSString *dateString = @"2011-09-02 17:49:54"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"Europe/Budapest"]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
[dateFormatter setTimeZone:tz]; 

NSDate *date = [dateFormatter dateFromString:dateString]; 
NSLog(@"%@", [dateFormatter stringFromDate:date]); 
NSLog(@"%@", [date descriptionWithCalendarFormat:nil timeZone:tz locale:nil]); 
+0

したがって、NSdateにはタイムゾーンの概念がありません。しかしそれはGMTのコンセプトを持っていますか?タイムゾーンをGMT時間に変換してNSDateオブジェクトに追加することはできませんか? – Nil

関連する問題