在向其添加周组件时,为NSDate对象设置所需的时间会失败

时间:2012-06-07 15:27:54

标签: iphone ios datetime

我正在尝试通过循环以下代码,每隔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,但是在我添加偏移组件后的第二个日志中,我得到{{ 1}}。奇怪的是,它会在第11次迭代中恢复到正确的时间。

我做错了什么以及如何解决这种奇怪的行为?

更新
正如UIAdam所说,这是由于夏令时发生的,所以这是一种正常行为。

1 个答案:

答案 0 :(得分:0)

由于日期跨越夏令时/标准时间(或您所在地区的某些等效物)之间的边界,额外小时出现/消失。