Estoy creando un generador de informes en Cocoa, y necesito para producir los intervalos de fechas convenientes tales como "Hoy", "Esta Semana", "Este mes", "este año", etc.¿Cómo puedo generar rangos de fechas convenientes basados en un NSDate dado?
¿Hay una buena forma de hacer esto? Aquí está mi esqueleto hasta el momento:
@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
Algunos casos ejemplo de uso sería de la siguiente manera:
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:[NSDate date]];
DateRange * thisYear = [DateRange rangeForYearContainingDate:[NSDate date]];
Esencialmente, quiero que el devuelto DateRange
objeto que contiene las fechas de inicio y fin de la semana, mes o año que rodea la fecha objetivo. Por ejemplo (en pseudocódigo):
NSDate * today = [August 25, 2009];
DateRange * thisWeek = [DateRange rangeForWeekContainingDate:today];
assert(thisWeek.startDate == [August 23, 3009]);
assert(thisWeek.endDate == [August 29, 3009]);
actualización:
que era capaz de conseguir este trabajo gracias a la answer provided by Kendall Helmstetter Geln. Aquí está el método completo para un rango de una semana:
+ (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];
}
Una cosa es posible que desee cambiar en su solución es tener '[alloc auto [ ] init] 'en lugar de' [[DateRange alloc ... ', de esta forma las subclases también se asignarán, en lugar de usar siempre DateRange, que podría ser su superclase. – jbrennan
@jbrennan: buen punto. Lo he cambiado –