App中经常会用到用户的年岭(比如 3岁零5个月),一般都是服务器换算后返回,但是也不免会有客户端换算的情况,为了确保年龄的数据一致,在做之前和我们的服务器程序员做了一次沟通,效仿他的代码写了下面的换算。
-(NSString *)guideShowWithTime:(NSString *)time{
//获取当前的 年 月 日
NSString *subTime = [time substringToIndex:10];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy.MM.dd";
NSDate *currentData = [formatter dateFromString:subTime];
NSDateComponents *currentComponents =[[NSCalendar currentCalendar] components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currentData];
NSInteger currentDateYear = [currentComponents year];
NSInteger currentDateMonth = [currentComponents month];
NSInteger currentDateDay = [currentComponents day];
//获取用户的 年 月 日
NSDateFormatter *userFormatter = [[NSDateFormatter alloc] init];
userFormatter.dateFormat = @"yyyy-MM-dd";
User *user = [[UserManager sharedUserManager] user];
NSDate *userDate = [userFormatter dateFromString:[user babyBirthday]];
NSDateComponents *userComponents =[[NSCalendar currentCalendar] components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:userDate];
NSInteger userDateYear = [userComponents year];
NSInteger userDateMonth = [userComponents month];
NSInteger userDateDay = [userComponents day];
NSMutableString *dateStr = [NSMutableString string];
int currentNumb = currentDateYear *10000+currentDateMonth*100+currentDateDay;
int userNumb = userDateYear*10000 + userDateMonth*100 +userDateDay;
int ageNumb = currentNumb - userNumb;
if (ageNumb<0) {//备孕
int dist = userNumb - currentNumb;
if (dist>280) {//备孕期
[dateStr appendString:@"备孕期"];
}else{//孕期
int week =(280-dist)/7;
[dateStr appendFormat:@"孕期%d周",week];
// self.guideValue = @"-10";
}
}
int years = 0;
int months = 0;
int days = 0;
if (ageNumb>=10000) {//有一岁
years = ageNumb/10000;
}
ageNumb = ageNumb%10000;
months = ageNumb/100;
if (months>12) {
months -=88;
}
days = ageNumb%100;
//当月第一天
NSString *firstStr = [NSString stringWithFormat:@"%d.%d.01",currentDateYear,currentDateMonth];
NSDate *firstDay = [formatter dateFromString:firstStr];
NSTimeInterval firstInterval = [firstDay timeIntervalSince1970];
NSTimeInterval lastInterval = firstInterval-24*3600;//上个月的最后一天
NSDate *lastDay = [NSDate dateWithTimeIntervalSince1970:lastInterval];
//上个月的天数
NSRange range = [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:lastDay];
NSUInteger numberOfDaysInMonth = range.length;
if (days>currentNumb%100) {
days = days-(100-numberOfDaysInMonth);
}
if (years>0) {
[dateStr appendFormat:@"%d岁",years];
}
if (months>0) {
[dateStr appendFormat:@"%d月",months];
}
if (days>0) {
[dateStr appendFormat:@"%d天",days];
}
// self.age = dateStr;
return dateStr;
// self.guideValue =[NSString stringWithFormat:@"%d%d",years,months];
// if (days==0) {
// return YES;
// }
// NSLog(@"dateStr ...%@",dateStr);
// return NO;
}
下面简单说一下算法原理:
1.把时间转换成数字
年份*10000+月份*100+日期,(2013-9-22 转换后为20130922)
2.当前时间减去生日当天得到差值
int currentNumb = currentDateYear *10000+currentDateMonth*100+currentDateDay;
int userNumb = userDateYear*10000 + userDateMonth*100 +userDateDay;
int ageNumb = currentNumb - userNumb;
3.除以10000换算岁数
int years = 0;
int months = 0;
int days = 0;
if (ageNumb>=10000) {//有一岁
years = ageNumb/10000;
}
4.换算月数,(为什么要-88,注:88+12=100)
ageNumb = ageNumb%10000;
months = ageNumb/100;
if (months>12) {
months -=88;
}
5换算天数,天数换算要减去上个月的天数,所以用当月的第一天减去24小时就是上个月的最后一天,然后获取上月总天数
days = ageNumb%100;
//当月第一天
NSString *firstStr = [NSString stringWithFormat:@"%d.%d.01",currentDateYear,currentDateMonth];
NSDate *firstDay = [formatter dateFromString:firstStr];
NSTimeInterval firstInterval = [firstDay timeIntervalSince1970];
NSTimeInterval lastInterval = firstInterval-24*3600;//上个月的最后一天
NSDate *lastDay = [NSDate dateWithTimeIntervalSince1970:lastInterval];
//上个月的天数
NSRange range = [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:lastDay];
NSUInteger numberOfDaysInMonth = range.length;
if (days>currentNumb%100) {
days = days-(100-numberOfDaysInMonth);
}