我正在寻找一种简单而有效的Objective-C算法,该算法从一年的特定季度(3个月)开始,增加或减少特定数量的宿舍。按季度计算日期
例如,2012年第一季度增加了10个季度,我得到的年份为:2012 +楼层(10/4)= 2012 + 2 = 2014,则季度:1 + Mod(10,4)= 1 + 2 = Q3。从2011年第三季度减去2季度,我想最终与2011年第一季度。
什么是最优雅的代码来完成这一点?
我正在寻找一种简单而有效的Objective-C算法,该算法从一年的特定季度(3个月)开始,增加或减少特定数量的宿舍。按季度计算日期
例如,2012年第一季度增加了10个季度,我得到的年份为:2012 +楼层(10/4)= 2012 + 2 = 2014,则季度:1 + Mod(10,4)= 1 + 2 = Q3。从2011年第三季度减去2季度,我想最终与2011年第一季度。
什么是最优雅的代码来完成这一点?
- (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
请注意,不需要floor,因为在C(和Objective-C)中,整数除法总是舍去余数(向下舍入)。 – lnafziger 2012-04-06 19:42:09
代码从这里改变:
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];
你开始与一个特定的日期,或如何存储你的数据?如果是特定日期,您是希望计算季度开始时间,还是仅在您开始的日期添加三个月期间? – lnafziger 2012-04-06 18:50:58
日期被存储为两个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