2014-05-15 64 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