Ich erstelle einen Berichtgenerator in Cocoa, und ich muss bequeme Datumsbereiche wie "Heute", "Diese Woche", "Dieser Monat", "Dieses Jahr" etc.Wie kann ich auf der Grundlage eines bestimmten NSDate geeignete Datumsbereiche generieren?
Gibt es eine Gute Möglichkeit, das zu tun? Hier ist mein Skelett so weit:
@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
Einige Beispielanwendungsfälle wäre wie folgt:
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:[NSDate date]];
DateRange * thisYear = [DateRange rangeForYearContainingDate:[NSDate date]];
Im Grunde möchte ich das zurück DateRange
Objekt, um die Start- und Enddaten für die Woche enthalten, Monat oder Jahr um das Zieldatum herum. Zum Beispiel (in Pseudo-Code):
NSDate * today = [August 25, 2009];
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:today];
assert(thisWeek.startDate == [August 23, 3009]);
assert(thisWeek.endDate == [August 29, 3009]);
Update:
konnte ich diese Arbeit dank der answer provided by Kendall Helmstetter Geln bekommen. Dies ist die komplette Methode für einen einwöchigen Bereich:
+ (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];
}
Eine Sache, die Sie vielleicht in Ihrer Lösung ändern wollen, ist '[[self alloc zu haben ] init] 'anstelle von' [[DateRange alloc ...], so ordnen sich Unterklassen auch selbst zu, anstatt immer DateRange zu verwenden, was ihre Oberklasse sein könnte. – jbrennan
@jbrennan: guter Punkt. Ich habe es geändert. –