Подтвердить что ты не робот

Как рассчитать первый NSDate текущей недели?

то есть:.

  NSDate *firstDayOfWeek = [[NSDate date] firstDayOfWeek];

например, сегодня - 19 августа, я бы хотел получить NSDate из 2010-08-15 12:00am из вышеприведенной строки кода. Спасибо!

4b9b3361

Ответ 1

Я думаю, что эти потоки отвечают на то, что вы ищете: http://www.cocoabuilder.com/archive/cocoa/211648-nsdatecomponents-question.html#211826

Заметьте, однако, что он не обрабатывает понедельники в качестве первых дней недели, поэтому вам, возможно, придется немного подкрутить его, вычитая [gregorian firstWeekday] вместо просто 1. Кроме того, я изменил его, чтобы использовать -currentCalendar, но это зависит от вас: -)

NSDate *today = [NSDate date];
NSCalendar *gregorian = [NSCalendar currentCalendar];

// Get the weekday component of the current date
NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:today];
/*
Create a date components to represent the number of days to subtract
from the current date.
The weekday value for Sunday in the Gregorian calendar is 1, so
subtract 1 from the number
of days to subtract from the date in question.  (If today Sunday,
subtract 0 days.)
*/
NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];
/* Substract [gregorian firstWeekday] to handle first day of the week being something else than Sunday */
[componentsToSubtract setDay: - ([weekdayComponents weekday] - [gregorian firstWeekday])];
NSDate *beginningOfWeek = [gregorian dateByAddingComponents:componentsToSubtract toDate:today options:0];

/*
Optional step:
beginningOfWeek now has the same hour, minute, and second as the
original date (today).
To normalize to midnight, extract the year, month, and day components
and create a new date from those components.
*/
NSDateComponents *components = [gregorian components: (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
                                            fromDate: beginningOfWeek];
beginningOfWeek = [gregorian dateFromComponents: components];

Ответ 2

Почему так сложно?:)

func firstDateOfWeekWithDate(date: NSDate) -> NSDate {

    var beginningOfWeek: NSDate?

    calendar.rangeOfUnit(.WeekOfYear, startDate: &beginningOfWeek, interval: nil, forDate: date)

    return beginningOfWeek!

}

Ответ 3

Решение naixn приведет к неправильным результатам, если в понедельник (2) будет установлен первый день недели, а дата, которую вы проверяете, - воскресенье. В этом случае вы получите результат в понедельник на следующей неделе.

Правильным способом было бы рассчитать компоненты вычитания следующим образом:

[componentsToSubtract setDay: - ((([weekdayComponents weekday] - [gregorian firstWeekday])
                                  + 7 ) % 7)];

Предполагая, что у вас всегда есть 7 дней в неделю.

Ответ 4

- (NSDate *)firstDateOfWeekWithDate:(NSDate *)date {

    NSCalendar * calendar = [NSCalendar currentCalendar];

    NSDateComponents *weekdayComponents = [calendar components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date];

    NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date];
    [components setDay:-((([weekdayComponents weekday] - [calendar firstWeekday]) + 5 ) % 7)];

    return [calendar dateFromComponents:components];
}

Ответ 5

Простейшее решение:

func firstDayOfWeek(date: NSDate) -> NSDate {
  let calendar = NSCalendar.currentCalendar()
  var dateComponents = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitWeekOfMonth, fromDate: date)
  dateComponents.weekday = 1
  return calendar.dateFromComponents(dateComponents)!
}

Ответ 6

Это уже было дан ответ, но как указал Вольфганг, в принятом ответе есть ошибка. Если первый день недели установлен как более высокая дата, чем заданный NSDate, результат будет неправильным. Вот полное решение, которое работает для всех возможных значений firstWeekday (пример использует понедельник).

- (NSDate *)weekOfDate:(NSDate *)originalDate
{
    NSCalendar *currentCal = [NSCalendar currentCalendar];
    [currentCal setFirstWeekday:2]; // Sun = 1, Mon = 2, etc.

    NSDateComponents *weekdayComponents = [currentCal components:NSCalendarUnitWeekday fromDate:originalDate];

    // Calculate the number of days to subtract and create NSDateComponents with them.
    NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];
    NSInteger daysToSubtract = (([weekdayComponents weekday] - [currentCal firstWeekday]) + 7) % 7;
    [componentsToSubtract setDay:-1 * daysToSubtract];

    return [currentCal dateByAddingComponents:componentsToSubtract toDate:originalDate options:0];
}

Ответ 7

Используйте NSDateComponents и установите для параметра weekday значение 1.