Je crée un générateur de rapport dans Cocoa, et j'ai besoin de produire des plages de dates convenables telles que "Aujourd'hui", "Cette semaine", "Ce mois", "Cette année", etcComment puis-je générer des plages de dates appropriées en fonction d'un NSDate donné?
Y at-il un bon moyen de le faire? Voici mon squelette jusqu'ici:
@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
Quelques exemples de cas d'utilisation seraient les suivantes:
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:[NSDate date]];
DateRange * thisYear = [DateRange rangeForYearContainingDate:[NSDate date]];
Essentiellement, je veux que le retour objet DateRange
pour contenir les dates de début et de fin de la semaine, mois ou année entourant la date cible. Par exemple (en pseudocode):
NSDate * today = [August 25, 2009];
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:today];
assert(thisWeek.startDate == [August 23, 3009]);
assert(thisWeek.endDate == [August 29, 3009]);
mise à jour:
j'ai pu obtenir ce travail grâce à la answer provided by Kendall Helmstetter Geln. Voici la méthode complète pour une gamme d'une semaine:
+ (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];
}
Une chose que vous voudrez peut-être changer dans votre solution est d'avoir '[[auto alloc ] init] 'au lieu de' [[DateRange alloc ... ', de cette façon les sous-classes vont aussi s'attribuer, au lieu de toujours utiliser DateRange qui pourrait être leur superclasse. – jbrennan
@jbrennan: bon point. Je l'ai changé. –