2016-05-25 6 views
1

は私がNSGregorianCalendar識別子とNSCalendarを使用して、dateFromComponentsNSDateを作成し、ここで奇妙な部分です: それは1900年12月31日NSDateComponentsからNSDateを作成しましたか?

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
components.year = 1900; components.month = 12; components.day = 31; 
NSDate *date = [calendar dateFromComponents:components]; 

components.year = 1901; components.month = 1; components.day = 1; 
NSDate *date2 = [calendar dateFromComponents:components]; 

NSLog(@"%@",calendar.timeZone.description); 
NSLog(@"%@",date); 
NSLog(@"%@",date2); 

前に、ある時点の前にいた場合、日付が間違って取得したログは次のようになります:

2016-05-25 14:58:21.014 date[79754:2192157] Asia/Shanghai (GMT+8) offset 28800 
2016-05-25 14:58:21.015 date[79754:2192157] 1900-12-30 15:54:17 +0000 
2016-05-25 14:58:21.015 date[79754:2192157] 1900-12-31 16:00:00 +0000 

ご覧のとおり、1日に5分のギャップがあります。 しかし、私が[NSTimeZone timeZoneForSecondsFromGMT:]でtimeZoneを設定すると、同じ秒数の偏差 - 28800であっても、それは正常です。 これは何の原因ですか?

答えて

1

いいえ、日付は間違っていません。代わりに、NSCalendarコードは、カレンダーが過去のいくつかの時点でタイムオフセットを変更するなど、あなたが夢見ることのないカレンダーに関するものを知っています。

アジア/上海のカレンダーは、タイムゾーンを変更する前の1日と、タイムゾーンを変更した日の1日の2つの日付を変換し、両方の時刻を正しく変換するように求めました。その夜、上海の皆は時計を調整しなければならなかった。

+0

タイムゾーンをアジア/上海に設定すると、同じ結果が得られます。ナイスキャッチ。 – Desdenova

-2

試してみてください!

NSCalendar *calendar = [NSCalendar currentCalendar]; 

NSDateComponents *components = [[NSDateComponents alloc] init]; 

[components setYear:1987]; 
[components setMonth:3]; 
[components setDay:17]; 
[components setHour:14]; 
[components setMinute:20]; 
[components setSecond:0]; 

NSDate *date = [calendar dateFromComponents:components]; 

・ホープこのヘルプ:)

+0

私はあなたに投票した理由を聞いてもいいですか? –

+0

あなたの答えは無関係です。 – Desdenova

+0

兄さんあなたの質問はコンポーネントからNSdateを作成していると思いますか? –

1

興味深い質問。あなたが見ているのは、時計が05m43sに戻ったときの01-01-1901の地方平均時間から中国標準時へのタイムゾーンの変化の影響です。

詳細here

関連する問題