0

次のコードをループして、2週間ごとの12:00(正午)に通知をスケジュールしようとしています...

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;

// Allocate new temporary calendar object with default timezone
NSCalendar *tmpCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[tmpCalendar setTimeZone:[NSTimeZone defaultTimeZone]];

// Allocate new temporary date components from the date to fire
NSDateComponents *tmpDateComps = [tmpCalendar components:unitFlags fromDate:dateToFire];

// Set time to '12.00'
[tmpDateComps setHour:12];
[tmpDateComps setMinute:0];

// Get new date to fire object based on date components
dateToFire = [tmpCalendar dateFromComponents:tmpDateComps];

NSLog(@"dateToFire %@", dateToFire);
// On 6th iteration = xx-xx-xxxx 09:00 +00:00
// On 11th iteration = xx-xx-xxxx 10:00 +00:00

// Allocate new temporary offset date components
NSDateComponents *tmpOffsetComps = [[NSDateComponents alloc] init];    

// Add a number of weeks
[tmpOffsetComps setWeek:2];

// Get new date to fire object based on offset date components
dateToFire = [tmpCalendar dateByAddingComponents:tmpOffsetComps toDate:dateToFire options:0];

NSLog(@"dateToFire %@", dateToFire);
//On 6th iteration = xx-xx-xxxx 10:00 +00:00
//On 11th iteration = xx-xx-xxxx 09:00 +00:00

どういうわけかdateToFire、ループ内のオブジェクトをログに記録すると、6回目の反復で最初に正しい結果xx-xx-xxxx 09:00 +00:00が得られますが、オフセットコンポーネントを追加した後の2回目のログで、が得られxx-xx-xxxx 10:00 +00:00ます。奇妙なことに、11回目の反復で正しい時刻に戻ります。

私は何を間違っているのですか、そしてこの奇妙な振る舞いを修正する方法は?

更新
UIAdamが述べたように、これは夏時間のために発生していたため、これは正常な動作です。

4

1 に答える 1

0

夏時間/標準時(またはお住まいの地域の同等の時間)の境界を越える日付が原因で、余分な時間が表示/非表示になっています。

于 2012-06-07T16:44:53.500 に答える