2014-04-27 7 views
2

저는 프로그래밍에 익숙하며 언급 한 해의 첫 주와 마지막 요일을 필사적으로 얻으려고합니다.주어진 주와 연도의 첫 번째 날짜와 마지막 날짜를 얻는 방법?

나는 방법을 만들려고했지만 이상한 날짜를 얻지 못했습니다.

+ (NSArray*)getStartDateOfWeek : (NSInteger)weekNumber withYear:(NSInteger)year { 
    NSMutableArray *result = [[NSMutableArray alloc]init]; 

    // Week Start Date 

    NSCalendar *gregorianStart = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *componentsStart = [[NSDateComponents alloc] init]; 


    [componentsStart setWeekOfYear:weekNumber]; 
    [componentsStart setYear:year]; 

    int startDayOfWeek = [[[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:[gregorianStart dateFromComponents:componentsStart]] weekday]; 
    [componentsStart setDay:([componentsStart day] - ((startDayOfWeek) - 2))]; 

    NSDate *beginningOfWeek = [gregorianStart dateFromComponents:componentsStart]; 

    // Week End Date 

    NSCalendar *gregorianEnd = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

    NSDateComponents *componentsEnd = [[NSDateComponents alloc]init]; 
    [componentsStart setWeekOfYear:weekNumber]; 
    [componentsStart setYear:year]; 

    int endDayOfWeek = [[[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:[gregorianEnd dateFromComponents:componentsEnd]] weekday]; 

    [componentsEnd setDay:([componentsEnd day]+ (7 - endDayOfWeek) + 1)]; // for end day of the week 

    NSDate *endOfWeek = [gregorianEnd dateFromComponents:componentsEnd]; 

    [result insertObject:beginningOfWeek atIndex:0]; 
    [result insertObject:endOfWeek atIndex:1]; 

    return result; 
} 

아무쪼록 잘 부탁드립니다.

답변

2

주어진 주일의 일요일 (첫 번째 날)과 토요일 (마지막 날)을 원한다고 가정하면이 코드는 원하는대로 처리 할 것입니다. (두 가지 방법을 만들었지 만 다시 결합 할 수는 있습니다.) -

+ (NSDate *)firstDayOfWeek:(NSInteger)weekNumber inYear:(NSInteger)year 
{ 
    NSDateComponents *comps=[[NSDateComponents alloc]init]; 
    [comps setWeekday:1];         //Change this to 2 if you want Monday rather than Sunday 
    [comps setWeekOfYear:weekNumber]; 

    [comps setYear:year]; 
    [comps setYearForWeekOfYear:year]; 

    NSCalendar *cal=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

    NSDate *newDate=[cal dateFromComponents:comps]; 

    return newDate; 

} 

+ (NSDate *)lastDayOfWeek:(NSInteger)weekNumber inYear:(NSInteger)year 
{ 
    NSDateComponents *comps=[[NSDateComponents alloc]init]; 
    [comps setWeekday:7];         //Change this to 6 if you want Friday rather than Saturday 
    [comps setWeekOfYear:weekNumber]; 

    [comps setYear:year]; 
    [comps setYearForWeekOfYear:year]; 

    NSCalendar *cal=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

    NSDate *newDate=[cal dateFromComponents:comps]; 

    return newDate; 

} 

한 가지 중요한 점은 [comps setYearForWeekOfYear:year];입니다 - 그렇지 않으면 당신은 주 1 예상치 못한 결과를 얻을 수 있습니다 - 다음 해 1 주 또한 당신이 해에 "마지막"주 1 얻을 것이다 기본적으로 , 그래서 당신은 당신이 예상했던 것보다 1 년 후에 끝납니다. 설명 주셔서 대단히 감사합니다

+(NSDictionary *)firstAndLastDayOfWeek:(NSInteger)weekNumber inYear:(NSInteger)year 
    { 
     NSDateComponents *comps=[[NSDateComponents alloc]init]; 
     [comps setWeekday:1]; 
     [comps setWeekOfYear:weekNumber]; 

     [comps setYear:year]; 
     [comps setYearForWeekOfYear:year]; 

     NSCalendar *cal=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

     NSDate *firstDay=[cal dateFromComponents:comps]; 

     [comps setWeekday:7]; 

     NSDate *lastDay=[cal dateFromComponents:comps]; 

     return @{@"firstDay":firstDay,@"lastDay":lastDay}; 

    } 
+0

- 당신이이 일에 방법을 결합하고 싶었다면

, 나는 오히려 NSArray보다는 NSDictionary을 사용합니다. NSDate + NSCalendar는 objective-c의 혼란스러운 부분입니다. 그것은 작동 ... – Moonstar

관련 문제