NSDate - 一年前,进退两难

时间:2011-01-18 22:35:37

标签: iphone objective-c ios nsdate nscalendar

我正在尝试做一些对我来说有点困难的事情。但我确信有人有一些见解。

给定一个日期,比如January 17, 2011,我试图找出与一年前这个日期相对应的日期。所以January 17, 2011是星期一,而一年前,这一天也是January 18, 2010(周一也是如此)。事实证明,January 18, 2010January 17, 2011之前354天。我原本以为只是简单地减去365天的非闰年和366天的闰年,但如果你这样做,你会得到January 17, 2010,这是星期日,而不是星期一。

因此,在使用NSDateNSCalendar的Objective-C中,我如何实现以下功能:

-(NSDate *)logicalOneYearAgo:(NSDate *)from {
}

换句话说,第n个月的第n个“工作日”(其中“工作日”是星期一或星期二或星期三等)

5 个答案:

答案 0 :(得分:22)

您可以像这样使用NSDateComponents:

- (NSDate *)logicalOneYearAgo:(NSDate *)from {

    NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

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

    return [gregorian dateByAddingComponents:offsetComponents toDate:from options:0];

}

答案 1 :(得分:11)

有关日历计算的Date and Time Programming Guide部分Adding Components to a Date

具体而言,感兴趣的方法是dateByAddingComponents:toDate:options

使用Apple示例作为基础,从当前日期减去一年,您将执行以下操作:

NSDate *today = [[NSDate alloc] init];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

/*
  Create a date components to represent the number of years to add to the current date.
  In this case, we add -1 to subtract one year.     
*/

NSDateComponents *addComponents = [[NSDateComponents alloc] init];
addComponents.year = - 1;

return [calendar dateByAddingComponents:addComponents toDate:today options:0];

答案 2 :(得分:3)

我无法保证这是最有效的方式,但您可以使用NSCalendarNSDateComponents来实现。将您的NSDate实例传递到[yourCalendar components:yourComponents fromDate:yourDate],从组件中减去一年,然后使用[yourCalendar dateFromComponents:yourComp]

很抱歉没有提供完整的代码,但是因为我使用过这些方法已经有一段时间了,而且我不想给你代码那些无效的代码。

答案 3 :(得分:0)

减1年。 然后减去1天,直到你想要一周的同一天结束。

每年“星期几”可以追溯到1天,除非中间有第29天,他们会回来2天。

这是因为一年是52周+ 1天(闰年+2)。

因此,如果你无限期地应用这个逻辑,你将在几年后于5月24日6月16日结束。

如果您不希望这种情况发生,您必须在某处记住参考年份并将算术基于此。

例如,如果“新”星期一是4天(因为3年过去了),您可能更愿意提前3天选择星期一,以免无限期地减去几天,几年。< / p>

希望它有所帮助。

答案 4 :(得分:-8)

答案结果非常简单。结果是反复试验。这是答案。

如果年份是闰年,则减去365天。

如果年份不是闰年,则减去364天。