Objective C – How can i get the weekday from NSDate?

| | August 18, 2015

I need to be able to get the weekday from nsdate, i have the following code and it always return 1. I tried to change the month, i tried everything from 1 to 12 but the result of the week day is always 1.

NSDate *date2 = [[NSDate alloc] initWithString:[NSString stringWithFormat:@"%d-%d-%d", 2010, 6, 1]];
unsigned units2 = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSWeekdayCalendarUnit;
NSCalendar *calendar2 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components2 = [calendar2 components:units2 fromDate:date2];
int startWeekDay = [components2 weekday];
[date2 release];
[calendar2 release];

4 Responses to “Objective C – How can i get the weekday from NSDate?”

  1. I’m using Xcode 6.4

    There are many ways to setup an NSDate. I won’t go over that here. You’ve done it one way, using a string (A method I avoid due to it being very vulnerable to error), and I’m setting it another way. Regardless, access your components weekday or setDay methods.

    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
    [calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"]];
    NSDateComponents *components = [calendar components:(NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitWeekday|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond) fromDate:[NSDate date]];
        NSDate *date = [calendar dateFromComponents:components];
    

    this way, you can get or set any of these components like this:

    [components weekday] //to get, then doSomething
    [components setDay:6]; //to set
    

    and, of course, set NSDate *date = [calendar dateFromComponents:components];only after you’ve changed the components.

    I added in the extra local and other components for context in case you’d like to set those too.

    It’s free code, don’t knock it.

  2. Edit for Mac:

    The format of the string has to be —YYYY-MM-DD HH:MM:SS ±HHMM according to the docs, all fields mandatory

    Old answer (for iPhone and tested on simulator):

    There is no (public) -initWithString: method in NSDate, and what you get returned is not what you expect.

    Use a properly configured (you need to give the input format) NSDateFormatter and -dateFromString:.

  3. I solved the problem, The problem was that the format of my date string was wrong:

    NSDate *date = [[NSDate alloc] initWithString:[NSString stringWithFormat:@"%d-%d-%d 10:45:32 +0600", selectedYear, selectedMonth, selectedDay]];
    

    and since i don’t care about the time i randomly pass a time to the end of the string

  4. Creating an NSDateFormatter that only contains the weekday will do what you want.

    NSDate *now = [NSDate date];
    NSDateFormatter *weekday = [[[NSDateFormatter alloc] init] autorelease];
    [weekday setDateFormat: @"EEEE"];
    NSLog(@"The day of the week is: %@", [weekday stringFromDate:now]);
    

    If you need internationalization, the NSDateFormatter can be sent a locale, which will give the proper translation.

    The date formatters are controlled through this standard: Unicode Date Formats

Leave a Reply