2012-04-06 197 views
0

我正在尋找一種簡單而有效的Objective-C算法,該算法從一年的特定季度(3個月)開始,增加或減少特定數量的宿舍。按季度計算日期

例如,2012年第一季度增加了10個季度,我得到的年份爲:2012 +樓層(10/4)= 2012 + 2 = 2014,則季度:1 + Mod(10,4)= 1 + 2 = Q3。從2011年第三季度減去2季度,我想最終與2011年第一季度。

什麼是最優雅的代碼來完成這一點?

+0

你開始與一個特定的日期,或如何存儲你的數據?如果是特定日期,您是希望計算季度開始時間,還是僅在您開始的日期添加三個月期間? – lnafziger 2012-04-06 18:50:58

+0

日期被存儲爲兩個int(一個季度,1..4)和一個年份(2000..2012)。這是我如何開始,但我的算法還沒有完成:'const int periodsInYear = 4; //一年中有4個季度' 'int yearsToAdd = floor(periodsToAdd/periodsInYear); //只取結果的整數部分,即10個季度/ 4 = 2.5,floor = 2個' 'int periodsInYearToAdd = fmod(periodsToAdd,periodsInYear); // 10個季度,10個模4 = 2' – AlexR 2012-04-06 18:56:36

回答

1
- (void)addQuarters:(NSInteger)quarters toYear:(NSInteger *)currentYear andQuarter:(NSInteger *)currentQuarter { 
    if (*currentYear < 0 || 
     *currentQuarter < 1 || 
     *currentQuarter > 4) { 
     return; 
    } 

    *currentYear += quarters/4; 
    *currentQuarter += quarters % 4; 

    if (*currentQuarter > 4) { 
     *currentQuarter -= 4; 
     *currentYear += 1; 
    } else if (*currentQuarter < 1) { 
     *currentQuarter += 4; 
     *currentYear -= 1; 
    } 
} 

// Example of use: 
NSInteger year = 2012; 
NSInteger quarter = 2; 

[self addQuarters:-7 toYear:&year andQuarter:&quarter]; 
NSLog(@"Quarter %i of %i", quarter, year); 
// Output: Quarter 3 of 2010 
+0

請注意,不需要floor,因爲在C(和Objective-C)中,整數除法總是捨去餘數(向下舍入)。 – lnafziger 2012-04-06 19:42:09

3

代碼從這裏改變:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1

NSDate *today = [[NSDate alloc] init]; 
NSCalendar *gregorian = [[NSCalendar alloc] 
      initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 

[offsetComponents setMonth:3]; // one quarter 

NSDate *oneQuarterFromToday = [gregorian dateByAddingComponents:offsetComponents 
      toDate:today options:0]; 
+0

可能值得使用'[NSCalendar currentCalendar]'而不是通用'NSGregorianCalendar',因爲日曆有一個時區,並且三個月的時間可能取決於您的地區是否遵守夏令時?我可能過於敏感。 – Tommy 2012-04-06 18:44:00

+0

這將不起作用,因爲今天可能會在幾個季度之間。你不能只在一年的任意月份增加3個月,並期望它是四分之一。 – Andy 2015-09-02 10:47:41