2013-02-25 57 views
1

下面的代码从日期中增加或减去一个月。在那个操作之后,我想明确地将每月的一天设置为15.我该如何实现?在NSDate上更改月份的日期

NSDateComponents* offsetComponents = [[NSDateComponents alloc]init]; 
int magnitude = isLeft ? 1 : -1; 
[offsetComponents setMonth:magnitude]; 
NSCalendar* calendar1 = [NSCalendar currentCalendar]; 
updatedDate = [calendar1 dateByAddingComponents:offsetComponents toDate:dateRef options:0]; 

回答

6

该月份的设置是无关紧要的和单独的操作。获取日期的组件,更改日期,然后重新组织日期。您可以在更改月份之前或之后执行此操作。

NSDate * today = [NSDate date]; 
NSCalendar * cal = [NSCalendar currentCalendar]; 

NSDateComponents * offsetComponents = [NSDateComponents new]; 
[offsetComponents setMonth:-1]; 

// Either 

NSDate * sameDayLastMonth = [cal dateByAddingComponents:offsetComponents 
               toDate:today 
               options:0]; 

NSDateComponents * lastMonthComps = [cal components:NSUIntegerMax 
              fromDate:sameDayLastMonth]; 
[lastMonthComps setDay:15]; 

NSDate * fifteenthOfLastMonth = [cal dateFromComponents:lastMonthComps]; 

// or 

NSDateComponents * todayComps = [cal components:NSUIntegerMax 
             fromDate:today]; 
[todayComps setDay:15]; 

NSDate * fifteenth = [cal dateFromComponents:todayComps]; 

NSDate * fifteenthOfLastMonth = [cal dateByAddingComponents:offsetComponents 
                toDate:fifteenth 
                options:0]; 

或者,更容易(废话,我应该首先做到了这一点):

NSDate * today = [NSDate date]; 
NSCalendar * cal = [NSCalendar currentCalendar]; 

NSInteger offset = arc4random_uniform(2) ? -1 : 1; 

NSDateComponents * comps = [cal components:NSUIntegerMax 
            fromDate:today]; 
[comps setDay:15]; 
[comps setMonth:[comps month] + offset]; 

NSDate * newDate = [cal dateFromComponents:comps]; 
+0

三江源先生谢谢! – Baconbeastnz 2013-02-25 23:43:27

相关问题