9

次のコードは問題を示しています。1435年の初日から1年間進んでも、1436の初日にはなりません。

私が欠けているアイデアはありますか?

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:1];
[components setMonth:1];
[components setYear:1435];


NSCalendar *islamic = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar];
NSDate *date = [islamic dateFromComponents:components];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setCalendar:islamic];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];

NSLog(@"%@", [dateFormatter stringFromDate:date]);  // -> 01.01.1435

NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setYear:1];

NSDate *dateWithOffset = [islamic dateByAddingComponents:offsetComponents toDate:date options:0];

NSLog(@"%@", [dateFormatter stringFromDate:dateWithOffset]); 
// -> 30.12.1435 ... WHY NOT 01.01.1436 ????
4

1 に答える 1

3

私の疑いは、夏時間と冬時間(夏時間)の違いによるものです。ムー。1435年は2013年11月5日に落ちますが、Muh。1436年は2014年10月25日です。最初のデートは冬の間、2番目のデートは夏の間です。

作成した最初のNSDateは、2013年11月5日00:00(深夜)です。「dateByAddingComponents:」は、コンポーネントを秒に変換し、それを最初の日付に追加することで機能します。この場合、夏季のため、結果は2014年10月24日23:00になります。

これは、タイムゾーン間の夏時間の違いにより、世界中の人々によって結果が異なる可能性があることも意味します。

この問題を防ぐには、最初の日付を深夜ではなく正午に設定します(これは、純粋な日付で作業する場合は一般的に良い考えです)。

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:1];
[components setMonth:1];
[components setYear:1435];
[components setHour:12];

さて、これが「dateByAddingComponents」の正しい動作であるかどうかは別の質問です。

于 2012-06-10T14:49:14.290 に答える