2014-01-22 103 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"]]; 

我已經驗證了上面的代碼和它的工作如預期。