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

给定一个日期,说 January 17, 2011, ,我试图找出与一年前的这个日期对应的那一天。所以 January 17, 2011 是星期一,一年前的这一天是 January 18, 2010 (也是星期一)。事实证明 January 18, 2010 是 354 天前 January 17, 2011. 。我原本想简单地减去非闰年的 365 天和闰年的 366 天,但如果在这种情况下这样做,你会得到 January 17, 2010, ,这是星期日,而不是星期一。

所以,在 Objective-C 中 NSDateNSCalendar, ,我怎样才能实现这样的功能:

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

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

有帮助吗?

解决方案 5

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

如果这一年是leap年,则减去365天。

如果这一年不是leap年,则减去364天。

其他提示

您使用NSDATECOMPONTENTS这样:

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

}

这在 日期和时间编程指南 日历计算部分, 将组件添加到日期

具体而言,感兴趣的方法是 dateByAddingComponents:Todate:选项.

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

我不能保证这是最有效的方法,但是您可以使用 NSCalendarNSDateComponents. 。通过你的 NSDate 实例进入 [yourCalendar components:yourComponents fromDate:yourDate], ,从组件中减去一年,然后使用 [yourCalendar dateFromComponents:yourComp].

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

减去1年。然后减去 1 天,直到得到您想要的一周中的同一天。

每年“星期几”都会回拨 1 天,除非中间有 2 月 29 日,否则会回拨 2 天。

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

因此,如果你无限期地应用这个逻辑,你最终会年复一年地把 6 月 16 日变成 5 月 24 日。

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

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

希望能帮助到你。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top