iOS用NSDateFormatter解析日期Bug

下午刚发生一个bug, 用户生日日期是"1991-04-14", 在年龄显示那里, 本该直接展示年龄, 结果却直接将生日日期"1991-04-14"展现出来了.
仔细看代码, 没发现什么问题:

+ (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"时, destDate = nil.
然后将代码中birthday写死, 换成其他日期, 比如"1991-04-15" 之类的, 发现没问题.
于是单纯的以为iOS系统在处理这个日期的时候出了bug, 还特意去网上搜了一下, 这天到底发生了什么事情, 是不是苹果公司那个工程师的特殊日子.
没有什么结果. 倒是发现也有人恰好碰到这个灵异事件.

于是单纯以为hardCode这个日期就行了啊! 然后同事发现了这个. 于是我觉得, 自己真的是太天真太想当然了. 应该搜索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) // 如果这样还是解析为空,且后台返回格式不是"yyyy-MM-DD",就返回默认值 18 吧
    {
        NSArray *subStrings = [birthday componentsSeparatedByString:@"-"];
        if (subStrings.count == 3)
        {
            // 拿到当前的年份
            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];
}

期间因马虎大意写错好几次,也是蛋碎.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容