5

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

给定一个日期,比如说January 17, 2011,我试图找出与一年前的这个日期相对应的日期。星期一也是如此January 17, 2011,而一年前,这一天January 18, 2010(也是星期一)。原来January 18, 2010是354天前January 17, 2011。我最初想只是简单地减去非闰年的 365 天和闰年的 366 天,但如果你在这种情况下这样做,你会得到January 17, 2010,这是星期天,而不是星期一。

NSDate因此,在带有and的 Objective-C 中NSCalendar,我如何实现一个函数,例如:

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

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

4

5 回答 5

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];

}
于 2011-01-18T22:47:09.723 回答
11

这在日历计算的日期和时间编程指南部分中有所介绍,将组件添加到日期

具体来说,感兴趣的方法是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];
于 2012-05-15T13:57:45.233 回答
3

我不能保证这是最有效的方法,但你可以使用NSCalendarand来做到这一点NSDateComponentsNSDate将您的实例传递给[yourCalendar components:yourComponents fromDate:yourDate],从组件中减去一年,然后使用[yourCalendar dateFromComponents:yourComp].

很抱歉没有提供完整的代码,但我已经有一段时间没有使用这些方法了,我不想给你提供不起作用的代码。

于 2011-01-18T22:42:47.840 回答
0

减去 1 年。然后减去 1 天,直到您在一周中的同一天结束。

每年“星期几”会向后退 1 天,除非中间有 2 月 29 日,否则会向后退 2 天。

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

所以如果你无限期地应用这个逻辑,你会年复一年地在 5 月 24 日拥有 6 月 16 日。

如果您不希望这种情况发生,则必须在某个地方记住参考年份并以此为基础进行算术运算。

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

希望能帮助到你。

于 2011-06-16T08:33:48.787 回答
-8

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

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

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

于 2011-01-18T23:41:29.577 回答