You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键改动说明

  1. 固定Locale为en_US_POSIX:这个区域是独立于系统设置的标准英文区域,确保无论真机系统语言是什么,都能正确解析__DATE__的英文月份缩写;
  2. 修正解析格式字符串:将原有的LLL d yyyy HH:mm:ss改为MMM dd yyyy HH:mm:ss,完全匹配__DATE__的输出格式(日期是两位数字,月份是英文缩写),避免解析时的格式不匹配问题。

内容的提问来源于stack exchange,提问作者Ruhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:57:24