2013-04-10 36 views
5

我錯過了有關NSDate dateByAddingTimeInterval如何與天一起工作嗎?這是我從特定日期(AIDate)減去33天的代碼。 AIDate的時間值爲00:00 PST。NSDate dateByAddingTimeInterval減去天數錯誤地更改時間

activityOne.ActivityDateTime = [AIDate dateByAddingTimeInterval:-33*24*60*60]; 

如果AIDate等於2013年4月9日00:00 PST,上面的代碼將減去33天和1小時該工程以2013年3月6日23:00 PST。

+2

您的問題可能是夏令時。永遠不要用24 * 60 * 60表示「1天」。 – 2013-04-10 04:11:51

+0

@MatthiasBauch對此需求是正確的NSDateComponents更好... – 2013-04-10 04:17:02

+0

@MatthiasBauch啊 - 這使得總體感 - 感謝張貼! – Aaron 2013-04-10 04:17:38

回答

11

24 * 60 * 60是指24小時,而不是1天。 當您的計算跨夏令時或夏令時時,這兩者之間存在巨大差異。

巧合的是,33天前您的時區沒有夏令時。

正確的方法是使用NSDateComponents。像這樣:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *offset = [[NSDateComponents alloc] init]; 
[offset setDay:-33]; 
NSDate *offsetedDate = [calendar dateByAddingComponents:offset toDate:[NSDate date] options:0]; 
6

你可以用波紋管代碼做到這一點..

NSDateComponents *dc = [[NSCalendar currentCalendar] components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSQuarterCalendarUnit fromDate:yourDate]; 
[dc setDay:dc.day - 33]; 
NSDate *noticeDate = [[NSCalendar currentCalendar] dateFromComponents:dc]; 

我希望這對你有幫助...

+0

這確實工作正常 - 感謝您發佈它。任何想法爲什麼我的代碼會不正確地減去它? – Aaron 2013-04-10 04:05:05

+0

@Aaron爲您的需求,如果可能的話,然後使用NSDateComponents給你完美的輸出..它更好的你..在這裏,你也可以使用這種類型的流NSDate * newDate1 = [現在addTimeInterval:60 * 60 * 24 * daysToAdd] ;爲添加日,但它不完美... – 2013-04-10 04:16:16