Цель 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()))")
Ответ 7
Я использовал следующий веб-сайт, который помог с настройкой строки, чтобы получить формат, который я хотел на моей дате
Coder Wall - Руководство по форматированию даты c объективом