/ / Як розрахувати перший NSDate поточного тижня? - iphone, какао-дотик, nsdate

Як розрахувати перший NSDate поточного тижня? - iphone, cocoa-touch, nsdate

тобто:

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

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

Відповіді:

36 за відповідь № 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"s 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];

21 для відповіді № 2

Чому так складно? :)

func firstDateOfWeekWithDate(date: NSDate) -> NSDate {

var beginningOfWeek: NSDate?

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

return beginningOfWeek!

}

11 для відповіді № 3

Рішення від naixn дасть помилкові результати, якщо понеділок (2) буде встановлений у перший день тижня, а дата, яку ви оглядаєте, - неділя. У цьому випадку ви отримаєте результат у понеділок наступного тижня.

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

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

Якщо припустити, що у вас завжди 7 днів на тиждень.


2 для відповіді № 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];
}

2 для відповіді № 5

На це вже відповіли, але як Вольфганг зазначив, у прийнятій відповіді є помилка. Якщо перший будній день встановлений як більша дата, ніж дата 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];
}

1 для відповіді № 6

Найпростіше рішення:

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)!
}

0 для відповіді № 7

Використовуйте NSDateComponents і встановіть weekday до 1


0 для відповіді № 8

Для Swift 4.1:

extension Date {
var startOfWeek: Date? {
let calendar = Calendar(identifier: .gregorian)
return calendar.date(from: calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))
}
}