NSCalendar первый день недели
Кто-нибудь знает, есть ли способ установить первый день недели в NSCalendar, или есть календарь, который уже имеет понедельник в качестве первого дня недели, а не в воскресенье. В настоящее время я работаю над приложением, которое основано на работе за неделю, и его нужно начинать в понедельник, а не в воскресенье. Я, скорее всего, поработаю над этим, но будет много угловых дел. Я бы предпочел, чтобы платформа сделала это для меня.
заранее спасибо
Вот код, который я использую. сейчас суббота, так что я надеюсь, что будний день будет 6, а не 7. это будет означать, что воскресенье будет 7, а не перевернется до 0
- Многостраничная электронная почта с текстом и календарем: Outlook не распознает ics
- Добавить еженедельное событие в календарь
- Android Calendar View для Date Picker
- Календарь возвращает неправильный месяц
- Java Calendar.set (Calendar.DAY_OF_WEEK, Calendar.WUNDAY), будет ли он откатываться назад, вперед или неизвестно?
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [gregorian setFirstWeekday:0]; unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit; NSDateComponents *todaysDate = [gregorian components:unitFlags fromDate:[NSDate date]]; int dayOfWeek = todaysDate.weekday;
- Добавить событие Calendar для Android из сети .vcs download
- Почему Java Calendar установлен (int year, int month, int date), не возвращает правильную дату?
- Получение событий из календаря
- Почему январь месяц 0 в Java-календаре?
- Триггерное уведомление еженедельно Swift 3
- Как получить национальные праздники в выбранной стране
- Календарь повторяющихся / повторяющихся событий - лучший способ хранения
- .NET. Получите все элементы календаря Outlook.
Изменить: это не проверяет край, где начинается начало недели в предыдущем месяце. Некоторые обновленные коды для этого: https://stackoverflow.com/a/14688780/308315
Если кто-то все еще обращает на это внимание, вам нужно использовать
ordinalityOfUnit:inUnit:forDate:
и установите firstWeekday на 2. (1 == Воскресенье и 7 == Суббота)
Вот код:
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; [gregorian setFirstWeekday:2]; // Sunday == 1, Saturday == 7 NSUInteger adjustedWeekdayOrdinal = [gregorian ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]]; NSLog(@"Adjusted weekday ordinal: %d", adjustedWeekdayOrdinal);
Помните, ординалы для будних дней начинаются с 1 в первый день недели, а не в ноль.
Ссылка на документацию .
Этот код создает дату, установленную в понедельник текущей недели:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *today = [NSDate date]; NSDate *beginningOfWeek = nil; BOOL ok = [gregorian rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek interval:NULL forDate: today];
setFirstWeekday: объект NSCalendar. Устанавливает индекс первого дня недели для получателя.
- (void)setFirstWeekday:(NSUInteger)weekday
Должен сделать трюк.
По-моему, эти настройки должны быть динамическими в соответствии с пользовательской локалью. Поэтому следует использовать:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [gregorian setLocale:[NSLocale currentLocale]];
Это приведет к тому, что календарь автоматически установит день первой недели в соответствии с пользовательской локалью. Если вы не разрабатываете свое приложение для определенной цели / пользовательской локали (или предпочитаете разрешить пользователю выбирать этот день).
У меня были проблемы с множеством ответов здесь. , возможно, это был только я. ,
Вот ответ, который работает для меня:
- (NSDate*)firstDayOfWeek { NSCalendar* cal = [[NSCalendar currentCalendar] copy]; [cal setFirstWeekday:2]; //Override locale to make week start on Monday NSDate* startOfTheWeek; NSTimeInterval interval; [cal rangeOfUnit:NSWeekCalendarUnit startDate:&startOfTheWeek interval:&interval forDate:self]; return startOfTheWeek; } - (NSDate*)lastDayOfWeek { NSCalendar* cal = [[NSCalendar currentCalendar] copy]; [cal setFirstWeekday:2]; //Override locale to make week start on Monday NSDate* startOfTheWeek; NSTimeInterval interval; [cal rangeOfUnit:NSWeekCalendarUnit startDate:&startOfTheWeek interval:&interval forDate:self]; return [startOfTheWeek dateByAddingTimeInterval:interval - 1]; }
Обновить:
Как было указано (в другом месте ) by @vikingosegundo, в целом лучше всего позволить местному определить, какой день является началом недели, однако в этом случае ОП просил начать неделю в понедельник, поэтому мы копируем системный календарь и переопределить firstWeekDay.
Проблема с ответом Криса – это краевой случай, когда начало недели начинается в предыдущем месяце. Вот еще один простой код, и он также проверяет регистр:
// Finds the date for the first day of the week - (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate { NSCalendar *calendar = [NSCalendar currentCalendar]; // Edge case where beginning of week starts in the prior month NSDateComponents *edgeCase = [[NSDateComponents alloc] init]; [edgeCase setMonth:2]; [edgeCase setDay:1]; [edgeCase setYear:2013]; NSDate *edgeCaseDate = [calendar dateFromComponents:edgeCase]; NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:edgeCaseDate]; [components setWeekday:1]; // 1 == Sunday, 7 == Saturday [components setWeek:[components week]]; NSLog(@"Edge case date is %@ and beginning of that week is %@", edgeCaseDate , [calendar dateFromComponents:components]); // Find Sunday for the given date components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate]; [components setWeekday:1]; // 1 == Sunday, 7 == Saturday [components setWeek:[components week]]; NSLog(@"Original date is %@ and beginning of week is %@", givenDate , [calendar dateFromComponents:components]); return [calendar dateFromComponents:components]; }
Я сделал это так.
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *today = [NSDate date]; NSDateComponents *compForWeekday = [gregorian components:(NSWeekdayCalendarUnit) fromDate:today]; NSInteger weekDayAsNumber = [compForWeekday weekday]; // The week day as number but with sunday starting as 1 weekDayAsNumber = ((weekDayAsNumber + 5) % 7) + 1; // Transforming so that monday = 1 and sunday = 7
Я вижу недоразумение в других сообщениях. Первый день недели, какой бы он ни был, имеет номер 1, а не 0. По умолчанию воскресенье = 1, как в «Руководстве по программированию даты и времени для cocoa: календарные вычисления»:
«Значение дня недели для воскресенья в григорианском календаре составляет 1»
Для понедельника в качестве первого рабочего дня единственным средством, которое у меня есть, является условие грубой силы, чтобы исправить расчет
NSCalendar *cal=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *comps = [cal components:NSWeekdayCalendarUnit fromDate:[NSDate date]]; // set to 7 if it's Sunday otherwise decrease weekday number NSInteger weekday=[comps weekday]==1?7:[comps weekday]-1;
Ниже также рассматривается краевой корпус,
- (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate]; [components setWeekday:2]; // 1 == Sunday, 7 == Saturday if([[calendar dateFromComponents:components] compare: curDate] == NSOrderedDescending) // if start is later in time than end { [components setWeek:[components week]-1]; } return [calendar dateFromComponents:components]; }
Попробуй это:
NSCalendar *yourCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] [yourCal setFirstWeekday:0];
… есть календарь, который уже имеет понедельник в качестве первого дня недели, а не в воскресенье.
Когда-нибудь, будет.
Iv выяснил способ отображения любого имени недели, используя nscalender .. используя следующий код. Просто откройте консоль из строки меню xcode, чтобы увидеть результаты. Копия Вставьте следующий код в свой метод viewDidLoad, чтобы получить первый день недели
NSDate *today = [NSDate date]; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"MM/dd/yyyy :EEEE"]; NSString *dateString = [dateFormat stringFromDate:today]; NSLog(@"date: %@", dateString); [dateFormat release]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:today]; [components setDay:([components day]-([components weekday]-1))]; NSDate *beginningOfWeek = [gregorian dateFromComponents:components]; NSDateFormatter *dateFormat_first = [[NSDateFormatter alloc] init]; [dateFormat_first setDateFormat:@"MM/dd/yyyy :EEEE"]; NSString *dateString_first = [dateFormat_first stringFromDate:beginningOfWeek]; NSLog(@"First_date: %@", dateString_first);
Выход будет:
date: 02/11/2010 :Thursday First_date: 02/07/2010 :Sunday
так как я запустил эту программу 2/11/2010, u получит желаемый результат в зависимости от текущей даты.
Аналогично, если u хочет получить первый рабочий день недели, то есть дату понедельника, просто немного измените код:
CHANGE: [components setDay:([components day]-([components weekday]-1))];
TO [components setDay:([components day]-([components weekday]-2))];
чтобы получить понедельники на эту неделю ..
Аналогично, вы можете попытаться найти дату любого из семи рабочих дней, изменив целое число -1, -2 и так далее …
Надеюсь, ур ответил.
Спасибо, Bonson Dias
Мой простой способ сделать это – получить понедельник = 0, воскресенье = 6:
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:[NSDate date]]; NSInteger dayNumStartingFromMonday = ([dateComponents weekday] - 2 + 7) % 7; //normal: Sunday is 1, Monday is 2
Кажется, что календарь ISO 8601 имеет первый день недели, установленный в понедельник по умолчанию.
Использование Календарь nextWeekend (iOS 10 или более поздняя версия ) и обыденность (спасибо @ kris-markel). Я получил понедельник в качестве первой недели для календаря en_US.
Вот пример этого с возвратом в firstWeekday:
extension Calendar { var firstWorkWeekday: Int { guard #available(iOS 10.0, *) else{ return self.firstWeekday } guard let endOfWeekend = self.nextWeekend(startingAfter: Date())?.end else { return self.firstWeekday } return self.ordinality(of: .weekday, in: .weekOfYear, for: endOfWeekend) ?? self.firstWeekday } }
Вы можете просто изменить .firstWeekday
календаря.
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; calendar.firstWeekday = 2;
Затем используйте rangeOfUnit:startDate:interval:forDate:
чтобы получить первый день
NSDate *startOfWeek; [calendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:&startOfWeek interval:nil forDate:[NSdate date]];