6

This code

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]);

shows the following in console:

Europe/Moscow (MSKS) offset 14400 (Daylight)

Europe/Moscow (MSKS) offset 14400 (Daylight)

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

So, the timezone for calendar and components is specified correctly, but [gregorian dateFromComponents:comp] returns NSDate value with wrong time zone (GMT).

What do I need to correct to get proper timezone?

4

2 に答える 2

6

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

NSDateオブジェクトはタイムゾーンの対象ではありません。Aは、基準日から測定された絶対的なNSDate瞬間を表します。たとえば、執筆時点では、現在の日付は(参照日からの秒数)のようなものであり、またはとして表すことができます。どちらも、同じ日付の人間が読める形式の異なる表現です。337035053.1998012011-09-06 20:50:53 GMT2011-09-06 22:50:53 CEST

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

于 2011-09-06T21:08:54.137 に答える
1

この質問は頻繁に出てきます。答えは、を使用しNSDateFormatterて日付形式の目的の出力を取得することです。現在、常にGMTタイムゾーンで印刷されています。以下のドキュメントについての説明は次のNSDateとおりです。

考察
この表現は、オペレーティングシステムのさまざまなリリース間で一定であることが保証されていません。日付をフォーマットするには、代わりに日付フォーマッターオブジェクトを使用する必要があります(NSDateFormatterおよびデータフォーマットガイドを参照)。

于 2011-09-06T21:09:24.060 に答える