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
相关产品推荐
相关产品推荐

