2014-01-22 69 views
-1

我想在我的应用程序中设置开始日期和结束日期。结束日期应该是开始日期的一个月。添加一个月到NSDate

例如

start date = 1st January 2014 
end date = 31st January 2014 

目前我使用下面的方法一个月添加到开始日期,但结束日期变得2月1日2014年

dateByAddingComponents:toDate:options: 

有没有办法实现我期待的结果因为结束日期将始终是一个月 - 从开始日期起一天?

我希望这是有道理的。

谢谢。

+0

2014年1月31日的预期产量是多少?是2月30日或2月28日? –

+0

我想我会做两个单独的dateByAddingComponents操作,第一次添加一个月,第二次减去一天。 –

+0

@isoyaboy你需要这个问题的更多帮助吗? – Tariq

回答

1

肯定的:

- (NSDate *)lastDayOfMonthDateForDate:(NSDate *)date { 
    NSDateComponents *comp = [NSDateComponents new]; 
    comp.day = -1; 
    comp.month = 1; 

    return [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0]; 
} 
+0

我刚刚在2014年3月31日尝试过您的方法,期望结果为2014年4月30日,但这些都是我的结果。 开始日期:2014-03-30 23:00:00 +0000 结束日期:2014-04-28 23:00:00 +0000。 由于某些原因,dateFromComponents将我的输入更改为2014年3月30日,我不确定为什么,但即使2014年3月30日结束日期仍然不正确 –

+0

我认为它应该只在下个月提供。 –

+0

@isoyaboy请检查我的答案。 –

4
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *dateComp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]]; 

NSLog(@"Input Date: %@",[NSDate date]); 

[dateComp setDay:dateComp.day - 1]; 

[dateComp setMonth:dateComp.month + 1]; 

NSDate *nextMonthMinusOneday = [gregorian dateFromComponents:dateComp]; 

NSLog(@"Output date %@",nextMonthMinusOneday); 

输出:

Input Date: 2014-03-31 21:21:34 +0000 
Output date 2014-04-30 05:00:00 +0000 
+0

我很感激所有的帮助。不幸的是,我不是在寻找本月的最后一天,我正在寻找一个月的日期 - 从给定日期开始的一天。 –

+0

哦..我明白了。我编辑了我的答案。我已于2014年3月31日进行了检查,结果为2014年4月30日。 –

+0

@isoyaboy:请检查输出日志。 –

0
- (NSDate *)dateForNextMonthMinusSingleDay:(NSDate *)date { 
    NSDateComponents *dayOffsetComponents = [[NSDateComponents alloc] init]; 
    [dayOffsetComponents setMonth:1]; 
    [dayOffsetComponents setDay:-1]; 
    return [[NSCalendar currentCalendar] dateByAddingComponents:dayOffsetComponents 
                 toDate:date 
                 options:0]; 
} 


- (NSDate *)dateFromMMDDYYYYString:(NSString *)string { 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 
    [formatter setDateFormat:@"MM/dd/yyyy"]; 
    return [formatter dateFromString:string]; 
} 


NSDate *date = [self dateForNextMonthMinusSingleDay:[self dateFromMMDDYYYYString:@"01/01/2014"]]; 

我已经验证了上面的代码和它的工作如预期。