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

iOS开发:dateFromString返回nil,多时间格式日期转换求助

问题分析与解决方案

我来帮你排查问题并搞定这个日期格式化的难题~

为什么你的代码会返回nil?

你的date一直为空,核心问题是日期格式字符串和输入的格式完全不匹配,拆解来看:

  • 第一个代码里,你用了@"dd/MM/yy HH:mm ":
    • HH是24小时制的小时标识,但你的输入是3:25 PM(12小时制),格式不匹配直接导致解析失败;
    • 格式字符串末尾多了一个空格,和输入的3:25 PM结构不一致,也会让解析逻辑出错。
  • 第二个代码里加了z(时区标识),但你的输入里根本没有时区信息,自然解析不出有效的NSDate。

正确的单格式解析代码

针对你给出的输入30/01/18 3:25 PM,我们要用12小时制的格式字符串解析,同时建议固定locale避免系统区域干扰:

NSString *releaseDate = @"30/01/18 3:25 PM";

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// 固定区域,防止系统语言/区域设置影响解析
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
// 完全匹配输入格式:日/月/年 + 12小时制时分 + AM/PM标识
[dateFormatter setDateFormat:@"dd/MM/yy h:mm a"];

NSDate *date = [dateFormatter dateFromString:releaseDate];
if (date) {
    // 设置输出格式:日/英文月缩写/年 + 12小时制时分 + AM/PM
    [dateFormatter setDateFormat:@"dd/MMM/yy h:mm a"];
    NSString *finalDate = [dateFormatter stringFromDate:date];
    NSLog(@"%@", finalDate); // 输出:30/Jan/18 3:25 PM
} else {
    NSLog(@"日期解析失败");
}

同时兼容12小时制和24小时制输入

如果输入同时存在两种格式(比如30/01/18 15:25和30/01/18 3:25 PM),可以给dateFormatter添加多个候选格式,让它自动尝试匹配:

NSString *releaseDate = @"30/01/18 15:25"; // 也可以是@"30/01/18 3:25 PM"

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
// 加入两种可能的输入格式:24小时制和带AM/PM的12小时制
dateFormatter.dateFormats = @[
    @"dd/MM/yy HH:mm", // 24小时制格式
    @"dd/MM/yy h:mm a" // 12小时制格式(带AM/PM标识)
];

NSDate *date = [dateFormatter dateFromString:releaseDate];
if (date) {
    [dateFormatter setDateFormat:@"dd/MMM/yy h:mm a"]; // 统一输出12小时制格式
    NSString *finalDate = [dateFormatter stringFromDate:date];
    NSLog(@"%@", finalDate);
    // 输入15:25时输出:30/Jan/18 3:25 PM
    // 输入3:25 PM时输出:30/Jan/18 3:25 PM
} else {
    NSLog(@"日期解析失败");
}

关键注意点

  • 格式字符串严格匹配:h对应12小时制,HH对应24小时制,a对应AM/PM标识,不能搞混;
  • 固定Locale:设置en_US_POSIX是为了避免不同系统区域(比如中文系统)对日期解析的影响,确保跨设备解析一致;
  • 不要加多余字符:格式字符串里不能出现输入中没有的内容(比如多余空格、时区标识z),否则会直接解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:15