以周为单位显示NSDates

场景:

我有跟踪iOS应用程序的费用,我将费用从费用详细信息视图控制器存储到表视图(带有提取结果控制器),该视图显示费用列表以及类别和金额和日期。 我的实体“Money”中有一个日期属性,它是费用或收入的父实体。

题:

我想要的是基本上对给定的一周,一个月或一年的费用进行分类,并将其显示为节标题,例如:(10月1日至10月7日,2012年),它显示费用金额和相关的东西,根据该特别的一周。 在该视图中提供了两个按钮,如果我按下右按钮,它将使一周增加一周(2012年10月1日至10月7日现在显示2012年10月8日 – 10月15日),同样左按钮将减少一周一个星期。

我怎么做到这一点? 我正在尝试以下代码 – 不起作用。

- (void)weekCalculation { NSDate *today = [NSDate date]; // present date (current date) NSCalendar* calendar = [NSCalendar currentCalendar]; NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:today]; [comps setWeekday:1]; // 1: Sunday firstDateOfTheWeek = [[calendar dateFromComponents:comps] retain]; [comps setWeekday:7]; // 7: Saturday lastDateOfTheWeek = [[calendar dateFromComponents:comps] retain]; NSLog(@" first date of week =%@", firstDateOfTheWeek); NSLog(@" last date of week =%@", lastDateOfTheWeek); firstDateOfWeek = [dateFormatter stringFromDate:firstDateOfTheWeek]; lastDateOfWeek = [dateFormatter stringFromDate:lastDateOfTheWeek]; } 

递增日期的代码 –

 - (IBAction)showNextDates:(id)sender { int addDaysCount = 7; NSDateComponents *dateComponents = [[[NSDateComponents alloc] init] autorelease]; [dateComponents setDay:addDaysCount]; NSDate *newDate1 = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:firstDateOfTheWeek options:0]; NSDate *newDate2 = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:lastDateOfTheWeek options:0]; NSLog(@" new dates =%@ %@", newDate1, newDate2); } 

假设本周显示如此(2012年11月4日 – 2012年11月10日),我按下增量按钮,我在控制台中看到,日期更改为2012年11月11日和2012年11月17日,这是正确但是如果我按下增量按钮再次,它再次显示相同的日期(2012年11月11日和2012年11月17日)。

请帮帮我。

在您的类中将currentDate声明为@property 。 试试吧。

 @property(nonatomic, retain) NSDate *currentDate; 

最初设置

 self.currentDate = [NSDate date]; 

在调用此方法之前。

 - (void)weekCalculation { NSCalendar* calendar = [NSCalendar currentCalendar]; NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:self.currentDate]; [comps setWeekday:1]; // 1: Sunday firstDateOfTheWeek = [[calendar dateFromComponents:comps] retain]; [comps setWeekday:7]; // 7: Saturday lastDateOfTheWeek = [[calendar dateFromComponents:comps] retain]; NSLog(@" first date of week =%@", firstDateOfTheWeek); NSLog(@" last date of week =%@", lastDateOfTheWeek); firstDateOfWeek = [dateFormatter stringFromDate:firstDateOfTheWeek]; lastDateOfWeek = [dateFormatter stringFromDate:lastDateOfTheWeek]; } 

加载视图后, self.currentDate更新self.currentDate值。 确保它没有在其他地方重置。

 - (IBAction)showNextDates:(id)sender { int addDaysCount = 7; NSDateComponents *dateComponents = [[[NSDateComponents alloc] init] autorelease]; [dateComponents setDay:addDaysCount]; NSDate *newDate1 = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:firstDateOfTheWeek options:0]; NSDate *newDate2 = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:lastDateOfTheWeek options:0]; NSLog(@" new dates =%@ %@", newDate1, newDate2); self.currentDate = newDate1; } 

我在我的一个旧项目中需要类似的东西,并通过下面的代码实现它。 它将此周日期设置为NSDate变量,并在每次按钮单击时添加/删除7天内的日期组件。 这是代码:

 NSCalendar *calendar = [NSCalendar currentCalendar]; [calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; NSDate *date = [NSDate date]; NSDateComponents *components = [calendar components:(NSYearCalendarUnit|NSWeekdayCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date ]; // [components setDay:([components day] - ([components weekday] )+2)]; self.currentDate = [calendar dateFromComponents:components]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"dd.MM.yyyy HH:mm:ss"; self.datelabel.text = [formatter stringFromDate:self.currentDate]; 

上面的代码计算本周开始并将其设置为currentDate变量。 我有两个名为prevClick和nextClick的UIAut UIButtons调用设置下一个或上一个周开始的方法:

 - (IBAction)prevClick:(id)sender { [self addRemoveWeek:NO]; 

}

 -(void)addRemoveWeek:(BOOL)add{ NSCalendar *calendar = [NSCalendar currentCalendar]; [calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; NSDateComponents *components = [calendar components:(NSYearCalendarUnit|NSWeekdayCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:self.currentDate ]; components.day = add?components.day+7:components.day-7; self.currentDate = [calendar dateFromComponents:components]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"dd.MM.yyyy HH:mm:ss"; self.datelabel.text = [formatter stringFromDate:self.currentDate]; 

}

 - (IBAction)nextClk:(id)sender { [self addRemoveWeek: YES]; 

}