Does the weekdaySymbol list always start with Sunday in any country?

4.3k Views Asked by At

I have this code:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSMutableArray *daysNames = [NSMutableArray arrayWithArray:dateFormatter.weekdaySymbols];
NSLog(@"daysNames = %@", daysNames);

it outputs:

daysNames = (
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
)

My question is:

If the user is in a country other than US, let's say France or Russia, will the array still start with Sunday (not Monday), or should I not rely on this?

The thing is I set alarm days. Visually, the user chooses from a table view, which always has Monday in the first row. And I keep 0 or 1 in an NSMutableArray based on the fact if the day is set or not. If daysNames[0] always corresponds to Sunday, I can easily shift all the elements one position to the right, and everything will map correctly, otherwise I have some more headaches dealing with one more case when week starts with Monday, not Sunday.

This is the full code I wrote for this (in United States it works perfectly):

// Set the short days names

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        NSMutableArray *daysNames = [NSMutableArray arrayWithArray:dateFormatter.weekdaySymbols];
        NSLog(@"daysNames = %@", daysNames);

        // daysNames will become @"SUN MON TUE WED THU FRI SAT";
        for (NSInteger i = 0; i < daysNames.count; i++) {

            NSUInteger length = ((NSString *)daysNames[i]).length;

            if (length > 3) {
                length = 3;
            }

            daysNames[i] = [daysNames[i] substringToIndex:length].uppercaseString;
        }

        NSString *sundayShortName = daysNames[0];

        // daysNames will become @"MON TUE WED THU FRI SAT SUN";
        for (NSInteger i = 1; i < daysNames.count; i++) {

            daysNames[i - 1] = daysNames[i];
        }

        daysNames[daysNames.count - 1] = sundayShortName;

        NSMutableArray *alarmDaysShortNames = [NSMutableArray array];

        for (NSInteger i = 0; i < alarm.alarmDays.count; i++) {

            if ([alarm.alarmDays[i] boolValue] == YES) {

                [alarmDaysShortNames addObject:daysNames[i]];
            }
        }

        alarmCell.alarmDaysLabel.text = [alarmDaysShortNames componentsJoinedByString:@" "];
4

There are 4 best solutions below

3
On BEST ANSWER

Yes. Sunday is always the weekday that comes first in that list. You can interrogate NSCalendar to find out what position in that list the week is considered to start on (Sunday for Americans, Monday for Europeans, etc).

0
On

Yes, you should not rely on this. If you want to start your weekday from monday rather than sunday. You can try like this:-

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setFirstWeekday:2]; //it is for monday
1
On

I just put my logic for Swift 4.

let dateFormatter = DateFormatter()
var weekDays: [String] = dateFormatter.weekdaySymbols
if weekDays[0] == "Sunday" {
     weekDays.append(weekDays[0])
     weekDays.remove(at: 0)
}
print(weekDays)

Check if first day is Sunday then first append "Sunday" in the Array list and remove it from first index.

0
On

Not sure if understood but here is the proposed solution, in Swift:

let shortWeekdaySymbols = Calendar.current.shortWeekdaySymbols

let localizedWeekdays: [String] = Array(shortWeekdaySymbols[Calendar.current.firstWeekday - 1 ..< Calendar.current.shortWeekdaySymbols.count] + shortWeekdaySymbols[0 ..< Calendar.current.firstWeekday - 1])

where localizedWeekdays is an array with a localized order of all the weekdays contained in Calendar's weekdaySymbols property.