Objective-C中dateFromString真机始终返回nil问题求助
解决Objective-C获取App构建日期真机返回nil的问题
你的代码在模拟器正常但真机返回nil,核心原因是**__DATE__宏生成的英文月份缩写,在真机非英文系统区域下无法被NSDateFormatter正确解析**,导致date对象为nil,最终返回结果为空。
问题根源
- __DATE__的输出格式是
MMM dd yyyy(例如Oct 25 2024),月份是英文缩写; - 真机的系统区域设置如果是中文或其他非英文语言,NSDateFormatter默认会使用对应区域的规则解析日期,无法识别英文月份,导致解析失败。
修正后的代码
NSString *GetBuildDate() { NSString *buildDate; // 拼接编译日期与时间字符串 NSString *dateStr = [NSString stringWithFormat:@"%@ %@", [NSString stringWithUTF8String:__DATE__], [NSString stringWithUTF8String:__TIME__]]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; // 强制使用固定区域,不受系统区域设置影响 dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; // 匹配__DATE__和__TIME__的输出格式 [dateFormatter setDateFormat:@"MMM dd yyyy HH:mm:ss"]; NSDate *date = [dateFormatter dateFromString:dateStr]; // 设置目标输出格式 [dateFormatter setDateFormat:@"dd MMM yyyy"]; buildDate = [dateFormatter stringFromDate:date]; return buildDate; }
关键改动说明
- 固定Locale为en_US_POSIX:这个区域是独立于系统设置的标准英文区域,确保无论真机系统语言是什么,都能正确解析__DATE__的英文月份缩写;
- 修正解析格式字符串:将原有的
LLL d yyyy HH:mm:ss改为MMM dd yyyy HH:mm:ss,完全匹配__DATE__的输出格式(日期是两位数字,月份是英文缩写),避免解析时的格式不匹配问题。
内容的提问来源于stack exchange,提问作者Ruhi
相关产品推荐
相关产品推荐

