Цель C - Как я могу получить будний день от NSDate?

Мне нужно получить день недели от nsdate, у меня есть следующий код, и он всегда возвращается 1. Я пытался изменить месяц, я пробовал все от 1 до 12, но результат дня недели всегда 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];

Ответ 1

Изменить для Mac:

Формат строки должен быть -YYYY-MM-DD HH: MM: SS ± HHMM в соответствии с документами, все обязательные поля

Старый ответ (для iPhone и протестированный на симуляторе):

В NSDate нет (общедоступного) метода -initWithString:, и то, что вы получите, не является тем, что вы ожидаете.

Используйте правильно настроенную (вам нужно указать формат ввода) NSDateFormatter и -dateFromString:.

Ответ 2

Создание NSDateFormatter, которое содержит только рабочий день, будет делать то, что вы хотите.

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

Если вам нужна интернационализация, NSDateFormatter можно отправить локаль, которая даст правильный перевод.

Форматы даты контролируются с помощью этого стандарта: Форматы даты Unicode

Ответ 3

Я решил проблему. Проблема заключалась в том, что формат моей строки даты был неправильным:

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

и так как я не забочусь о времени, когда я произвольно передаю время до конца строки

Ответ 4

Я использую Xcode 6.4

Есть много способов настроить NSDate. Я не буду проходить это здесь. Вы сделали это одним способом, используя строку (метод, которого я избегаю, потому что он очень уязвим для ошибок), и я устанавливаю это другим способом. Независимо от того, получите доступ к своим компонентам будний день или методы setDay.

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];

таким образом, вы можете получить или установить любой из этих компонентов следующим образом:

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

и, конечно, установите NSDate *date = [calendar dateFromComponents:components]; только после того, как вы изменили компоненты.

Я добавил дополнительные локальные и другие компоненты для контекста на случай, если вы тоже захотите их установить.

Это бесплатный код, не стучите.

Ответ 5

Любой, кто приходит сюда в поисках более нового решения Swift 4:

extension Date {

    func getDayOfWeek() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone.current
        dateFormatter.locale = Locale(identifier: "en_US")
        dateFormatter.setLocalizedDateFormatFromTemplate("EEEE")

        return dateFormatter.string(from: self)
    }
}

let inputString = "2018-04-16T15:47:39.000Z"

let result = inputString.getDayOfWeek()

результат = Monday

Ответ 6

Самый откровенный ответ в Swift 3.

let formatter = DateFormatter()
formatter.dateFormat = "EEEE"
print("The day of the week is \(formatter.string(from: Date()))")