PHP日期验证函数问题:单数字日/月输入无法被正确识别
问题分析与修复方案
嘿,这个问题一眼就能找到症结!咱们来拆解下你的代码哪里出了问题:
你的验证逻辑最后一步用了$d->format('j-F-Y') === $date做匹配,但j这个日期格式符是不带前导零的日数字(比如会把03变成3),而用户输入的日期日部分是带前导零的(比如03-February-2018里的03)。这就导致解析后的日期格式化后变成了3-February-2018,和原输入字符串不相等,所以错误地返回了false——哪怕这个日期本身完全有效。
修复后的代码
只需要把比较时用的格式符从j改成d就行,d是带前导零的两位日数字,和你要求的输入格式完全匹配:
function validateDate($date){ $d = DateTime::createFromFormat('d-F-Y', $date); return $d && $d->format('d-F-Y') === $date; } echo validateDate("03-February-2018"); // 现在会正确返回true啦
小知识点补充
d:代表两位数字的日,自动补前导零(范围01到31)j:代表不带前导零的日(范围1到31)- 用和输入格式完全一致的
d-F-Y来格式化解析后的日期,再和原输入比较,既能验证输入格式是否合规,又能确保日期本身是有效的。
内容的提问来源于stack exchange,提问作者M9A
相关产品推荐
相关产品推荐

