Tworzę generator raportów w kakao i muszę tworzyć dogodne zakresy dat, takie jak "Dzisiaj", "W tym tygodniu", "W tym miesiącu", "W tym roku", itp.Jak wygenerować dogodne zakresy dat na podstawie danego NSDate?
Czy istnieje dobry sposób na zrobienie tego? Oto mój szkielet dotąd:
@interface DateRange : NSObject
{
NSDate startDate;
NSDate endDate;
}
@property (nonatomic, retain) NSDate * startDate;
@property (nonatomic, retain) NSDate * endDate;
+ (DateRange *)rangeForDayContainingDate:(NSDate *)date;
+ (DateRange *)rangeForWeekContainingDate:(NSDate *)date;
+ (DateRange *)rangeForMonthContainingDate:(NSDate *)date;
+ (DateRange *)rangeForYearContainingDate:(NSDate *)date;
@end
Niektóre przypadki przykład stosowanie byłoby następująco:
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:[NSDate date]];
DateRange * thisYear = [DateRange rangeForYearContainingDate:[NSDate date]];
Zasadniczo, chcę zwrócony DateRange
obiekt do zawierać daty rozpoczęcia i zakończenia na tydzień, miesiąc lub rok wokół docelowej daty. Na przykład (w Pseudokod):
NSDate * today = [August 25, 2009];
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:today];
assert(thisWeek.startDate == [August 23, 3009]);
assert(thisWeek.endDate == [August 29, 3009]);
zmiana:
udało mi się uzyskać tej pracy dzięki answer provided by Kendall Helmstetter Geln. Oto pełna metoda przedziale tygodniowym:
+ (DateRange *)rangeForWeekContainingDate:(NSDate *)date
{
DateRange * range = [[self alloc] init];
// start of the week
NSDate * firstDay;
[[self calendar] rangeOfUnit:NSWeekCalendarUnit
startDate:&firstDay
interval:0
forDate:date];
[range setStartDate:firstDay];
// end of the week
NSDateComponents * oneWeek = [[NSDateComponents alloc] init];
[oneWeek setWeek:1];
[range setEndDate:[[self calendar] dateByAddingComponents:oneWeek
toDate:firstDay
options:0]];
[oneWeek release];
return [range autorelease];
}
Jedno może chcesz zmienić w swoim rozwiązaniem jest mieć '[[self alloc ] init] 'zamiast' [[DateRange alloc ... ', w ten sposób podklasy również będą się alokować, zamiast zawsze używać DateRange, która może być ich nadklasą. – jbrennan
@jbrennan: dobry punkt. Zmieniłem to. –