6

I want to get the Week number of the year from the date.I tried the code as follow but gives me a wrong week number.

My code for week number:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"YYYY-MM-dd"];
    NSDate *date = [dateFormatter dateFromString:@"2012-09-15"];


    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSLog(@"week: %i", [[calendar components: NSWeekOfYearCalendarUnit fromDate:date] weekOfYear]); //Display 38 instead of 37
}

Note: If i try with with [NSDate date] display the correct.

Help me to solve this.. Thank you,

user2526811
  • 1,233
  • 4
  • 20
  • 54
  • see my answer http://stackoverflow.com/questions/17403761/get-the-day-from-the-date-in-ios-sdk/17403855#17403855 – SAMIR RATHOD Jul 11 '13 at 07:47
  • 2
    There are different definitions for the week number of a date. I think that's the most likely cause of your problem. See http://en.wikipedia.org/wiki/Calendar_week#Week_numbering for details. – Treb Jul 11 '13 at 07:47
  • @SAMIRRATHOD,Thanks for reply... it just shows about the week day not for the week number . – user2526811 Jul 11 '13 at 07:49

4 Answers4

20

ObjectiveC:

 NSCalendar *calendar = [NSCalendar currentCalendar];
 NSDateComponents *dateComponent = [calendar components:(NSWeekOfYearCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:[NSDate date]];
 NSLog(@"%@",dateComponent);

Update

 NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponent = [calendar components:(NSCalendarUnitWeekOfYear | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:date];
    NSLog(@"%@",dateComponent);

Swift:

let calendar = NSCalendar.currentCalendar()
let dateComponent = calendar.components([.WeekOfYear, .Day, .Month, .Year], fromDate: NSDate(timeIntervalSinceNow: 0))
print("weekOfYear \(dateComponent.weekOfYear)")

Swift 3 - Swift 5:

let component = Calendar.current.component(.weekOfYear, from: Date())
print("Week of Year \(component)")
Misha Vyrko
  • 992
  • 6
  • 14
  • Thanks for reply.. But when i try to give the date from String as seen above, it returns the wrong week number. – user2526811 Jul 11 '13 at 07:51
11

[NSCalendar currentCalendar] gives you a Gregorian Calendar as default. You can use

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSISO8601Calendar];

to get an ISO 08601 conform calendar, which has week number 37 for your date.

AlexVogel
  • 10,601
  • 10
  • 61
  • 71
  • sorry but for the `2012-09-25`, it returns _38 instead of 39_. **What's going wrong now?** – user2526811 Jul 11 '13 at 09:05
  • try to set the first week day of the calendar to the correct value (I don't know which ..) with - (void)setFirstWeekday:(NSUInteger)weekday – AlexVogel Jul 11 '13 at 09:25
0

Swift 3: You need know last Date of selected month. Than check number of week for this week, and this will be your number of weeks in month

return Calendar.current.component(.weekOfMonth, from: lastDate ?? Date())
0

Updated code in ObjectiveC used Xcode version - 9.1 - :

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponent = [calendar components:(NSCalendarUnitWeekOfYear | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:[NSDate date]];
    NSLog(@"%ld",(long)[dateComponent weekOfYear]);
Shashi Verma
  • 3,760
  • 3
  • 12
  • 19