2011-09-06 4 views
5

このコードNSCalendarのdateFromComponents:代わりsystemTimeZone

NSCalendar *calendar =[NSCalendar currentCalendar]; 
[gregorian setTimeZone:tz]; 

NSLog(@"%@", [gregorian timeZone]); 

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[NSDate date]]; 

[comp setDay:info.day]; 
[comp setMonth:info.month]; 
[comp setYear:info.year]; 
[comp setHour:info.hour]; 
[comp setMinute:info.minute]; 
[comp setSecond:info.second]; 
[comp setTimeZone:tz]; 

NSLog(@"%@", [comp timeZone]); 
NSLog(@"%@", [gregorian dateFromComponents:comp]); 

のGMTタイムゾーンは、コンソールで次の例を示します。

Europe/Moscow (MSKS) offset 14400 (Daylight) 

Europe/Moscow (MSKS) offset 14400 (Daylight) 

2011-08-31 20:00:00 +0000 

だから、カレンダー、コンポーネントのタイムゾーンが正しく指定されているが、NSDate値を[gregorian dateFromComponents:comp]返します間違ったタイムゾーン(GMT)で

適切なタイムゾーンを取得するには、何を修正する必要がありますか?

+2

あなたが直接 'NSDate'objectをのNSLog場合、あなたは常にGMT表現を取得します。とにかく、 'NSDate'オブジェクトにはタイムゾーンの概念がありません。それらは、基準日から測定された**絶対的な瞬時値**を表します。あなたは 'NSDateFormatter'を使って、異なる時間帯の日付の異なる人間が読める*表現*を得ることができますが、それらは表現です。 – albertamg

+0

私は、NSDateがタイムスタンプの重要でないビットで派生したタイムゾーンを隠していると思います。しかし、これは[NSDate description]にのみ使用されることを意図しており、最高で信頼できません。 –

+0

ええ、そうですね。 ありがとう、今私はそれを得る:) – Mitry

答えて

6

あなたが見ている出力は完全に正常です。 NSDateオブジェクトを直接NSLogすると、メソッドが返すものはすべて取得されます。これは、日付のGMT表現です(ただし、石ではありません)。

NSDateオブジェクトはタイムゾーンの対象ではありません。 NSDateは、基準日から測定した時間で瞬時のを表す。たとえば、現在の日付は337035053.199801(基準日からの秒数)のようなもので、2011-09-06 20:50:53 GMTまたは2011-09-06 22:50:53 CESTと表示されます。両方とも同じ日付の異なる人間が読める表現です。

結論として、適切なタイムゾーンを得るためには何が必要ですか?あなたの好きなタイムゾーンでNSDateの文字列表現を取得するには、NSDateFormatterを使用する必要があります。

+0

NSDateはGMTを参照しています。 – zaph

+1

基準日は実際には、2001年1月1日のGMTの最初の瞬間です。とにかく、これは、カウントを開始する時点、すなわち「0.0」を表し、その時点を任意のタイムゾーンを使用して表すことができます。 – albertamg

+0

スペース内の場所、具体的にはタイムゾーン。 – zaph

1

この質問はかなり頻繁に現れ、答えはNSDateFormatterを使用して日付形式の出力を取得することです。現在は常にGMTタイムゾーンで表示されます。ここでNSDateのドキュメントのための議論がある:

ディスカッション
表現は、オペレーティング・システムの異なるリリース間 一定に維持することが保証されていません。 に日付をフォーマットするには、代わりに日付フォーマッタオブジェクトを使用する必要があります( NSDateFormatterとデータの書式ガイドを参照してください)