下午剛發(fā)生一個(gè)bug, 用戶生日日期是"1991-04-14", 在年齡顯示那里, 本該直接展示年齡, 結(jié)果卻直接將生日日期"1991-04-14"展現(xiàn)出來了.
仔細(xì)看代碼, 沒發(fā)現(xiàn)什么問題:
+ (NSString *)ageFromBirthday:(NSString *)birthday
{
if (birthday == nil) return NSLocalizedString(@"is_not_set", nil);
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *destDate = [dateFormatter dateFromString:birthday];
if (destDate == nil)
{
return birthday;
}
NSDate *now = [NSDate date];
NSDateComponents* ageComponents = [[NSCalendar currentCalendar]
components:NSCalendarUnitYear
fromDate:destDate
toDate:now
options:0];
NSInteger age = [ageComponents year];
return [NSString stringWithFormat:@"%ld",age];
}
但是就是在日期是"1991-04-14"時(shí), destDate = nil
.
然后將代碼中birthday寫死, 換成其他日期, 比如"1991-04-15" 之類的, 發(fā)現(xiàn)沒問題.
于是單純的以為iOS系統(tǒng)在處理這個(gè)日期的時(shí)候出了bug, 還特意去網(wǎng)上搜了一下, 這天到底發(fā)生了什么事情, 是不是蘋果公司那個(gè)工程師的特殊日子.
沒有什么結(jié)果. 倒是發(fā)現(xiàn)也有人恰好碰到這個(gè)靈異事件.
于是單純以為hardCode這個(gè)日期就行了啊! 然后同事發(fā)現(xiàn)了這個(gè). 于是我覺得, 自己真的是太天真太想當(dāng)然了. 應(yīng)該搜索NSDateFormatter return nil
啊! 果然SO上還是有解釋.
于是, 就這么干了:
+ (NSString *)ageFromBirthday:(NSString *)birthday
{
if (birthday == nil) return NSLocalizedString(@"is_not_set", nil);
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
NSDate *destDate = [dateFormatter dateFromString:birthday];
NSDate *now = [NSDate date];
if (destDate == nil) // 如果這樣還是解析為空,且后臺(tái)返回格式不是"yyyy-MM-DD",就返回默認(rèn)值 18 吧
{
NSArray *subStrings = [birthday componentsSeparatedByString:@"-"];
if (subStrings.count == 3)
{
// 拿到當(dāng)前的年份
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSCalendarUnitYear;
NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:now];
NSInteger year = [dateComponent year];
NSInteger resultAge = year - [subStrings[0] integerValue];
return [NSString stringWithFormat:@"%ld",resultAge];
}
return @"18";
}
NSDateComponents* ageComponents = [[NSCalendar currentCalendar]
components:NSCalendarUnitYear
fromDate:destDate
toDate:now
options:0];
NSInteger age = [ageComponents year];
return [NSString stringWithFormat:@"%ld",age];
}
期間因馬虎大意寫錯(cuò)好幾次,也是蛋碎.