公司需要解决判断当前日期处于那个对应节气区间,参照需求
在当前网上关于而是二十四节气的算法核心:
if(iDay <15) day= 15 - ((flag>>4)&0x0f); else day = ((flag)&0x0f)+15; int index = -1; //对应日期节气判断 if(iDay == day){ index = (iMonth-1) *2 + (iDay>15? 1: 0); }
修改后代码改正如下,可以判断出对应节气区间区间:
1 - (NSInteger)lunarIndex { 2 NSCalendar *localeCalendar = [NSCalendar currentCalendar]; 3 4 unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 5 6 NSDateComponents *localeComp = [localeCalendar components:unitFlags fromDate:self]; 7 8 NSInteger iYear = localeComp.year; 9 NSInteger iMonth = localeComp.month; 10 NSInteger iDay = localeComp.day; 11 12 13 int array_index = (iYear - START_YEAR)*12+iMonth -1 ; 14 15 int64_t flag = gLunarHolDay[array_index]; 16 int64_t day; 17 18 int index_in_month = 0; 19 20 if(iDay <15) 21 day= 15 - ((flag>>4)&0x0f); 22 else { 23 day = ((flag)&0x0f)+15; 24 index_in_month += 1; 25 } 26 27 int index = -1; 28 29 index = (iMonth-1) *2 + index_in_month; 30 31 if (iDay >= day) { 32 33 } else { 34 index -=1; 35 if (index < 0) { 36 index = 24 - 1; 37 } 38 } 39 //从立春开始 40 if ( index >= 0 && index < 24 ) { 41 return (index + 22) % 24 + 1; 42 } else { 43 return InvalidLunarIndex; 44 } 45 }
在改写过程中出现了边界值未判断的问题,更正后,将所有相关条件结果在同一判断条件内完成组织,干掉三元。
如此看,为了避免边界值问题,应该将相关条件结果在同一判断条件内统和,然后世界就和谐了。