NSDate - 一年前,困境
-
12-10-2019 - |
题
我正在尝试做一些对我来说有点困难的事情。但我确信有人有一些洞察力。
给定一个日期,说 January 17, 2011
, ,我试图找出与一年前的这个日期对应的那一天。所以 January 17, 2011
是星期一,一年前的这一天是 January 18, 2010
(也是星期一)。事实证明 January 18, 2010
是 354 天前 January 17, 2011
. 。我原本想简单地减去非闰年的 365 天和闰年的 366 天,但如果在这种情况下这样做,你会得到 January 17, 2010
, ,这是星期日,而不是星期一。
所以,在 Objective-C 中 NSDate
和 NSCalendar
, ,我怎样才能实现这样的功能:
-(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];
我不能保证这是最有效的方法,但是您可以使用 NSCalendar
和 NSDateComponents
. 。通过你的 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 天的星期一,以免无限期地减去日子、年复一年。
希望能帮助到你。