nscalendar date fromComponents:SystemTimeZoneの代わりにGMT TimeZone
-
27-10-2019 - |
質問
このコード
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]);
コンソールの以下を示します。
Europe/Moscow (MSKS) offset 14400 (Daylight)
Europe/Moscow (MSKS) offset 14400 (Daylight)
2011-08-31 20:00:00 +0000
したがって、カレンダーとコンポーネントのタイムゾーンは正しく指定されていますが、 [gregorian dateFromComponents:comp]
間違ったタイムゾーン(GMT)でNSDATE値を返します。
適切なタイムゾーンを取得するには、何を修正する必要がありますか?
解決
表示されている出力は完全に正常です。 nslog a NSDate
直接オブジェクト、あなたは何でも取得します description
メソッドは、日付のGMT表現です(ただし、石に刻まれていません)。
NSDate
オブジェクトはタイムゾーンの対象ではありません。 a NSDate
を表します 絶対の 参照日から測定された時間の瞬間。たとえば、執筆時点では、現在の日付は 337035053.199801
(参照日から数秒)。 2011-09-06 20:50:53 GMT
また 2011-09-06 22:50:53 CEST
. 。どちらも異なる人間の読み取り可能な表現です 同じ 日にち。
結論として、適切なタイムゾーンを取得するには何が必要ですか?使用する必要があります NSDateFormatter
あなたの文字列表現を取得するため NSDate
どんなタイムゾーンでもあなたが好きなもの。
他のヒント
この質問はかなり頻繁に発生し、答えは NSDateFormatter
日付形式の目的の出力を取得します。現在、GMT TimeZoneで常に印刷されています。これがドキュメントの議論です NSDate
:
討論
表現は、オペレーティングシステムの異なるリリース全体で一定のままであることは保証されていません。日付をフォーマットするには、代わりにフォーマッタオブジェクトを使用する必要があります(nsdateFormatterおよびデータフォーマットガイドを参照)