Objective-C中如何准确校验日期格式为dd/MM/yyyy?
可靠的"dd/MM/yyyy"日期格式校验方法
你遇到的问题其实是NSDateFormatter的默认容错特性在搞鬼——它会自动尝试"兼容"一些不符合指定格式的输入,比如把连字符替换成斜杠来解析,所以才会出现"22-12-1996"这种格式不对的字符串也能生成日期的情况。要实现严格的格式校验,得从两个方面入手:关闭Formatter的容错模式,再加上反向验证确保日期本身合法。
下面是完整的解决方案:
关键配置与步骤
- 关闭容错模式:设置
lenient = NO,告诉DateFormatter必须严格匹配你指定的格式,不能自行调整输入的分隔符或日期数值。 - 固定区域设置:使用
en_US_POSIX区域,避免不同地区的系统设置(比如本地化日期格式)干扰解析结果。 - 反向验证:把解析出来的日期再转回字符串,和原输入对比——这一步能过滤掉那些格式对但日期本身非法的情况(比如"32/12/1996"这种不存在的日期)。
完整代码示例
- (BOOL)isValidDDMMYYYYDate:(NSString *)dateString { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; // 固定区域,避免本地化影响 dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; // 指定目标格式 dateFormatter.dateFormat = @"dd/MM/yyyy"; // 关闭容错,严格匹配格式 dateFormatter.lenient = NO; // 第一步:尝试解析字符串 NSDate *parsedDate = [dateFormatter dateFromString:dateString]; if (!parsedDate) { return NO; } // 第二步:反向验证,确保日期值完全匹配输入 NSString *reFormattedDate = [dateFormatter stringFromDate:parsedDate]; return [reFormattedDate isEqualToString:dateString]; }
测试效果
- 输入
"22/12/1996":解析成功,反向格式化后和原字符串一致,返回YES - 输入
"22-12-1996":格式不匹配,解析失败,返回NO - 输入
"32/12/1996":虽然可能被解析成1997年1月1日,但反向格式化后是"01/01/1997",和原输入不一致,返回NO - 输入
"22/13/1996":月份非法,解析失败,返回NO
这样就能确保只有完全符合dd/MM/yyyy格式且日期合法的字符串才会被判定为有效。
内容的提问来源于stack exchange,提问作者Jaime Alcántara Arnela
相关产品推荐
相关产品推荐

