2014-05-15 66 views
4

我试图让第一,当前季度的最后日期的第一天,我使用它:获取当前季度

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitQuarter | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; 

components.quarter = 1; 

funStartDate = [[NSCalendar currentCalendar] dateFromComponents: components]; 
NSLog(@"First day of quater: %@", funStartDate); 

[components setQuarter:[components quarter]+1]; 

funEndDate = [[NSCalendar currentCalendar] dateFromComponents: components]; 
NSLog(@"Last day of quater: %@", [funEndDate descriptionWithLocale:[NSLocale currentLocale]]); 

但在这两个控制台打印我看到今天的日期。我做错了什么?

+0

既然你已经日,月和年在您的组件,四分之一认为是多余的(和不一致的)和被忽略。 (我只是在3个月内添加 - 当然在年底时会“换行”。)(或者,最好使用dateByAddingCompoonents。) –

+0

记录'quarter'的值。此功能是否正常工作?不,它不是:http://stackoverflow.com/questions/11618784/i-want-to-get-a-quarter-value-in-nsdatecomponents-class因此,放弃所有希望让你的代码以这种方式工作。 – matt

+0

其实,@HotLicks,没有必要“包装”这一年。向月份组件添加3将正常工作。日期组件_is_(是)执行日历算术的正确方法。 – matt

回答

8

更新:我发现苹果公司的季度单位错误仍然存​​在于iOS 7.1中,因此请避免在日期组件中使用本设备。你

在这里,我得到了工作液:

季度的第一天:

NSDate *date = <whatever>; 
    NSCalendar *currentCalendar = [NSCalendar currentCalendar]; 
    NSDate *startOfQuarter; 
    [currentCalendar rangeOfUnit: NSQuarterCalendarUnit 
         startDate: &startOfQuarter 
         interval: NULL 
         forDate: date]; 
    NSLog(@"quarter starts at %@", startOfQuarter); 

季度的最后一天:

NSDateComponents* comps = [currentCalendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) 
               fromDate:date]; 
    NSUInteger quartalNum = (comps.month - 1)/3 + 1; 
    NSUInteger lastQuartalMonthNum = quartalNum * 3; 
    NSUInteger nextQuartalFirstMonth = lastQuartalMonthNum + 1 
    [comps setMonth: nextQuartalFirstMonth]; 
    [comps setDay: 0]; // with 0 day we get last day of previous month 

    NSLog(@"quarter ends at %@", [currentCalendar dateFromComponents: comps]); 
+0

这不工作我有一个错误:类型日历的值有没有成员rangeOfUnit –

+1

@AdamSmaka Swift 3相当于'dateInterval(of:start:interval:for:)' – vadian

2

雨燕3.1。四分之一组件仍然无法使用解决方法:

extension Date { 
    public var startOfQuarter: Date { 
     let startOfMonth = Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))! 

     var components = Calendar.current.dateComponents([.month, .day, .year], from: startOfMonth) 

     let newMonth: Int 
     switch components.month! { 
     case 1,2,3: newMonth = 1 
     case 4,5,6: newMonth = 4 
     case 7,8,9: newMonth = 7 
     case 10,11,12: newMonth = 10 
     default: newMonth = 1 
     } 
     components.month = newMonth 
     return Calendar.current.date(from: components)! 
    } 
} 

用法:

Date().startOfQuarter