NSCalendar первый день недели - PullRequest
43 голосов
/ 10 июля 2009

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

Заранее спасибо

Вот код, который я использую. сейчас суббота, так что я надеюсь, что будний день будет 6, а не 7. это будет означать, что воскресенье будет 7 вместо того, чтобы перейти к 0

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;

Ответы [ 16 ]

0 голосов
/ 26 июля 2017

Использование календаря 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
    }
}
0 голосов
/ 25 июля 2014

По умолчанию в календаре ISO 8601 первый день недели установлен на понедельник.

0 голосов
/ 05 сентября 2013

Мой простой способ сделать это - получить понедельник = 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
0 голосов
/ 11 февраля 2010

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, вы получите желаемый результат в зависимости от текущей даты.

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

ИЗМЕНЕНИЕ: [components setDay:([components day]-([components weekday]-1))];

TO [components setDay:([components day]-([components weekday]-2))];

чтобы получить дату понедельника для этой недели ..

Точно так же вы можете попытаться найти дату любого из семи рабочих дней, изменив целое число -1, -2 и так далее ...

Надеюсь, вы ответили на вопрос ..

Спасибо, Бонсон Диас

0 голосов
/ 12 октября 2009

… есть ли в календаре первый день недели, в котором уже понедельник, а не воскресенье.

Когда-нибудь будет.

0 голосов
/ 10 июля 2009

Попробуйте это:

NSCalendar *yourCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
[yourCal setFirstWeekday:0];
...