Ios 获取第一个和最后一个工作日。一年中第一周和最后一周的奇怪行为

Ios 获取第一个和最后一个工作日。一年中第一周和最后一周的奇怪行为,ios,objective-c,cocoa-touch,nsdate,Ios,Objective C,Cocoa Touch,Nsdate,我想获得给定年份的给定星期(数字)的第一天和最后一天。 我写的函数在一年的最后一周和第一周都有效 例如,如果我要的是年2014年的周的工作日1和7,我就得到了2015年的第一周 2014-12-28 // weekday 1 2015-01-03 // weekday 7 但正确的结果应该是 2013-12-29 // weekday 1 2014-01-04 // weekday 7 如果我要求2013年第51周,我正确收到: 2013-12-15 // weekday 1 201

我想获得给定年份的给定星期(数字)的第一天和最后一天。 我写的函数在一年的最后一周和第一周都有效

例如,如果我要的是
2014年
周的
工作日
17,我就得到了2015年的第一周

2014-12-28 // weekday 1
2015-01-03 // weekday 7 
但正确的结果应该是

2013-12-29 // weekday 1  
2014-01-04 // weekday 7 
如果我要求2013年第51周,我正确收到:

2013-12-15 // weekday 1
2013-12-21 // weekday 7
这里是我的函数,我如何修复这种奇怪的行为

// Return the date which is the weekday for a given week number and year
+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year{

    // Date component
    NSDateComponents *comp = [[NSDateComponents alloc]init];
    [comp setWeekOfYear:week];
    [comp setWeekday:weekday];
    [comp setYear:year];

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *date = [calendar dateFromComponents:comp];

    NSLog(@"week %d year %d weekday %d\n%@", week, year, weekday, date);
    return date;
}
编辑-------------

在@Guillaume回答之后,我使用
setWeekOfYear
而不是
setYear
修改了我的代码。它部分起作用了,我正确地得到了一周的最后一天,但作为第一个工作日,我得到了下一周的第一天。现在我得到了这个错误与任何星期数,不仅是第一或最后一年

以下是2014年第1周的新结果:

2014-01-05 // weekday1... it should be 2013-12-29. damn!
2014-01-04 // weekday7... it should be 2014-01-04. great! 
正如信息一样,我使用以下代码调用我的分类函数:

self.fromDate = [NSDate weekDay:1 forWeekOfYear:self.selectedWeek year:self.selectedYear];
self.toDate = [NSDate weekDay:7 forWeekOfYear:self.selectedWeek year:self.selectedYear];

您正在创建错误的日历对象

通过以下方式创建它:

NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

您是否尝试了
setYearForWeekOfYear:
而不是
setYear:


NSCalendar
中还有一个属性
minimumDaysInFirstWeek
,可能值得一看……

您已经解决了吗

尝试:

我得到这个结果

2013-12-18 14:57:48.090 datecal[20740:303] week 1 year 2014 weekday 1 29/12/2013 00:00:00
2013-12-18 14:57:48.091 datecal[20740:303] week 1 year 2014 weekday 7 04/01/2014 00:00:00
对于此代码(星期日一周的第一天):


如果你把它混在一起

calendar.firstWeekday = MONDAY;
NSDate *fromDate = [NSDate weekDay:SUNDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:SATURDAY forWeekOfYear:1 year:2014];
你会在编辑中看到你描述的行为,因为很明显,你的日历以周一为一周的开始,你会填写周日和周六吗


如果要尊重用户的区域设置,可以执行以下操作:

@interface NSDate (WeekBoundries)
+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year;
@end

@implementation NSDate (WeekBoundries)


+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year{

    NSDateComponents *comp = [[NSDateComponents alloc]init];
    [comp setWeekOfYear:week];
    [comp setWeekday:weekday];
    [comp setYearForWeekOfYear:year];

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDate *date = [calendar dateFromComponents:comp];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:[NSDateFormatter dateFormatFromTemplate:@"yyyy-MM-dd HH:mm:ss"
                                                             options:0
                                                              locale:[NSLocale currentLocale]]];
    NSLog(@"week %ld year %ld weekday %ld %@", (long)week, (long)year, (long)weekday, [formatter stringFromDate:date]);
    return date;
}

@end

-(void)method
{
        static NSUInteger SUNDAY = 1;
        static NSUInteger MONDAY = 2;
        static NSUInteger SATURDAY = 7;

        NSCalendar *calendar = [NSCalendar currentCalendar];

        NSDate *fromDate = [NSDate weekDay:(calendar.firstWeekday == MONDAY)? MONDAY : SUNDAY forWeekOfYear:1 year:2014];
        NSDate *toDate = [NSDate weekDay:(calendar.firstWeekday == MONDAY)? SUNDAY : SATURDAY forWeekOfYear:1 year:2014];
}

我仍然收到奇怪的结果:`2015-01-04//weekday1``2015-01-03//weekday7`您是否尝试过setYearForWeekOfYear。我试着用它代替了setYear。你正在目睹的行为在WWDC 2011视频中有介绍。你应该看,太好了!我马上就看
calendar.firstWeekday = SUNDAY;
calendar.firstWeekday = MONDAY;
NSDate *fromDate = [NSDate weekDay:SUNDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:SATURDAY forWeekOfYear:1 year:2014];
NSDate *fromDate = [NSDate weekDay:MONDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:SUNDAY forWeekOfYear:1 year:2014];
calendar.firstWeekday = MONDAY;
NSDate *fromDate = [NSDate weekDay:SUNDAY forWeekOfYear:1 year:2014];
NSDate *toDate = [NSDate weekDay:SATURDAY forWeekOfYear:1 year:2014];
@interface NSDate (WeekBoundries)
+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year;
@end

@implementation NSDate (WeekBoundries)


+ (NSDate*)weekDay:(NSInteger)weekday forWeekOfYear:(NSInteger)week year:(NSInteger)year{

    NSDateComponents *comp = [[NSDateComponents alloc]init];
    [comp setWeekOfYear:week];
    [comp setWeekday:weekday];
    [comp setYearForWeekOfYear:year];

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDate *date = [calendar dateFromComponents:comp];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:[NSDateFormatter dateFormatFromTemplate:@"yyyy-MM-dd HH:mm:ss"
                                                             options:0
                                                              locale:[NSLocale currentLocale]]];
    NSLog(@"week %ld year %ld weekday %ld %@", (long)week, (long)year, (long)weekday, [formatter stringFromDate:date]);
    return date;
}

@end

-(void)method
{
        static NSUInteger SUNDAY = 1;
        static NSUInteger MONDAY = 2;
        static NSUInteger SATURDAY = 7;

        NSCalendar *calendar = [NSCalendar currentCalendar];

        NSDate *fromDate = [NSDate weekDay:(calendar.firstWeekday == MONDAY)? MONDAY : SUNDAY forWeekOfYear:1 year:2014];
        NSDate *toDate = [NSDate weekDay:(calendar.firstWeekday == MONDAY)? SUNDAY : SATURDAY forWeekOfYear:1 year:2014];
}