Cocoa 找到下周一的日期

Cocoa 找到下周一的日期,cocoa,cocoa-touch,nsdate,date-arithmetic,Cocoa,Cocoa Touch,Nsdate,Date Arithmetic,我想知道当前日期后下周一的日期 所以如果今天的日期是2013-08-09(星期五),那么我想知道2013-08-12的日期 如何执行此操作?您可以使用NSCalendar方法dateFromComponents:传递正确启动的NSDateComponents对象 NSDateComponents *components = [[NSCalendar currentCalendar] components: NSYearCalendarUnit | NSWeekOfYearCalendarUnit

我想知道当前日期后下周一的日期

所以如果今天的日期是2013-08-09(星期五),那么我想知道2013-08-12的日期


如何执行此操作?

您可以使用
NSCalendar
方法
dateFromComponents:
传递正确启动的
NSDateComponents
对象

NSDateComponents *components = [[NSCalendar currentCalendar] components: NSYearCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]];

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setWeekOfYear:[components weekOfYear] + 1];
[comps setWeekday:1];
[comps setYear:[components year]];
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setFirstWeekday:2]; //This needs to be checked, which day is monday?
NSDate *date = [calendar dateFromComponents:comps];

这样的东西可以工作(盲目输入)

这段代码应该能满足您的需要。它只计算从星期一算起的天数,并从当前日期附加它

NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit fromDate:now];

NSUInteger weekdayToday = [components weekday];  
NSInteger daysToMonday = (9 - weekdayToday) % 7;

NSDate *nextMonday = [now dateByAddingTimeInterval:60*60*24*daysToMonday];
未经测试,但应该有效,无需担心更改日历的第一个日期


它甚至可以很容易地每隔一天添加到一周的,只需更改
内的
9
(9-工作日今天)%7通过
7+weekDayYouWant
,记住星期日=1,星期一=2…

假设一周从星期日开始(星期日=0),这段代码不是在星期日运行时只获取后一周的星期一而不是后一天吗?工作日单位是数字1到n,其中n是一周中的天数。例如,在公历中,n是7,星期日用1表示。因此,是的,可能需要对代码进行更改,稍微编辑一下代码,以考虑到这一点。当然,你也应该检查一下今天不是一年中的最后一周等等。@Vik这不管用,但我喜欢这种方法。虽然这是一个简单的问题,不需要太多努力,但日期在任何语言中都是令人讨厌的,所以我不明白你为什么要被否决。谢谢Lucas,效果很好。只有一件事,如果今天是周一,那么我想在下周一而不是本周一展示。你能告诉我怎样才能做到这一点吗?谢谢你,阿加尼,我不认为有一种优雅的方式可以改变一天的行为。但是您可以在
nextMonday
code:
daysToMonday=(daysToMonday==0)之前添加(而不是替换)类似的内容?7:星期一至星期一。这样,当当前日期为星期一时,您将添加7天,而不是0天。如果你能为这个案子找到更好的解决方案,请告诉我谢谢你的快速回复&你的解决方案非常有效:)谢谢夏令时不起作用。有关添加macOS 10.9/iOS 8之后的天数的修改解决方案,请参见此。建议的方法是
nextDayAfterDate:matchingComponents:options:
of
NSCalendar
。它可以考虑世界各地的日光节约变化,并且比<代码> 86400 更可靠。