0

特定の四半期 (3 か月) から開始して、特定の四半期数を加算または減算する、シンプルだが効率的な Objective-C アルゴリズムを探しています。

たとえば、2012 年の第 1 四半期に 10 四半期を追加すると、年は 2012 + Floor(10 / 4) = 2012 + 2 = 2014 となり、四半期は 1 + Mod (10, 4) = 1 + 2 = Q3 になります。2011 年の第 3 四半期から 2 四半期を差し引くと、2011 年の第 1 四半期になります。

これを達成するための最もエレガントなコードは何でしょうか?

4

2 に答える 2

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];
于 2012-04-06T18:38:38.860 に答える
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
于 2012-04-06T19:17:23.800 に答える