Цель C - Как я могу получить день недели от NSDate? - PullRequest
11 голосов
/ 19 августа 2010

Мне нужно иметь возможность получить день недели от 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];

Ответы [ 7 ]

44 голосов
/ 19 августа 2010

Создание 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

6 голосов
/ 19 августа 2010

Редактировать для Mac:

Формат строки должен быть —ГГГГ-ММ-ДД ЧЧ: ММ: СС ± ЧЧММ в соответствии с документами, все поля обязательны для заполнения

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

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

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

0 голосов
/ 19 января 2019

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

Coder Wall - Руководство по форматированию даты c цели

0 голосов
/ 09 июля 2018

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

let formatter = DateFormatter()
formatter.dateFormat = "EEEE"
print("The day of the week is \(formatter.string(from: Date()))")
0 голосов
/ 18 апреля 2018

Любой, кто приезжает сюда в поисках более нового решения 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()

result = Monday

0 голосов
/ 13 августа 2015

Я использую 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]; только после того, как вы изменили компоненты.

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

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

0 голосов
/ 19 августа 2010

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

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

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

...