Objective-C:从现在开始减去100年

时间:2014-01-24 14:29:32

标签: objective-c nsdate

如何从NSDate中减去100年?

我有这个:

NSDate *now = [NSDate date];
NSDate *hundredYearsAgo = [now dateByAddingTimeInterval:100*365*24*60*60];

但是,这并没有考虑到365天和366天的年数。

2 个答案:

答案 0 :(得分:25)

使用NSCalendarNSDateComponents进行日期计算。

unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay;
NSDate *now = [NSDate date];
NSCalendar *gregorian = [NSCalendar currentCalendar];
NSDateComponents *comps = [gregorian components:unitFlags fromDate:now];
[comps setYear:[comps year] - 100];
NSDate *hundredYearsAgo = [gregorian dateFromComponents:comps];

然后观看此视频,解释为什么您不应该自己进行日期计算:
The Problem with Time & Timezones - Computerphile

答案 1 :(得分:21)

你应该使用NSCalendar和NSDateComponents进行类似的计算,因为它们会变得非常棘手,并且可能充满烦人的边缘情况。

如果您使用NSCalendar和NSDateComponents(如下面的代码),它将照顾您的所有闰年。

NSDate *now = [NSDate date];
NSDateComponents *minusHundredYears = [NSDateComponents new];
minusHundredYears.year = -100;
NSDate *hundredYearsAgo = [[NSCalendar currentCalendar] dateByAddingComponents:minusHundredYears
                                                                        toDate:now
                                                                       options:0];

如果您想要对该主题进行一些额外的阅读,我已经在Objective-C一般性文章中写过working with dates