PHP中如何验证“March 21, 2015”格式的日期字符串是否有效?
验证PHP中“March 21, 2015”格式的日期有效性
嘿,我来帮你搞定这个日期验证的问题!先说说你之前遇到的问题出在哪,再给你靠谱的解决方案。
为什么你之前的方法行不通?
1. strtotime的局限性
strtotime()虽然能解析很多日期格式,但它有两个致命问题:
- 对一些非标准格式的解析不稳定,偶尔会返回
false,这时候date()函数就会输出1970年的默认日期,也就是你看到的错误。 - 它会自动“修正”无效日期,比如你输入
February 30, 2024,它会偷偷转换成March 1, 2024,导致你误判这是个有效日期。
2. DateTime::createFromFormat的参数错误
你之前用的格式是'Y-m-d G:i:s',但你的日期字符串是March 21, 2015这种英文月份+日期+年份的格式,两者完全不匹配,所以创建对象失败。另外报错“第二个参数必须是字符串”,大概率是你的$myString变量不是字符串类型(比如是null、数字,或者根本没定义),得先确保变量是正确的字符串哦。
正确的验证方案
针对你这种"英文月份全称 日期, 年份"的格式(比如March 21, 2015),我们需要用对应的格式字符串'F j, Y'来解析:
F:代表完整的英文月份名称(比如March、July)j:代表不带前导零的日期(比如21、20)Y:代表4位年份(比如2015、2018)
而且必须加上二次验证,防止DateTime自动修正无效日期。完整代码如下:
// 你的日期字符串 $dateString = 'March 21, 2015'; // 匹配你日期格式的格式字符串 $targetFormat = 'F j, Y'; // 尝试创建DateTime对象 $dateObj = DateTime::createFromFormat($targetFormat, $dateString); // 双重验证:对象创建成功,且格式化后和原字符串完全一致(避免自动修正无效日期) if ($dateObj !== false && $dateObj->format($targetFormat) === $dateString) { echo "✅ 这是一个有效的日期!"; // 如果你需要转换为d/m/Y格式,直接用format即可 echo "<br>转换为d/m/Y格式:" . $dateObj->format('d/m/Y'); } else { echo "❌ 无效的日期!"; }
其他变体格式的适配
如果你的日期字符串有其他形式,只需要修改$targetFormat即可:
- 如果日期带前导零(比如
March 05, 2015):用'F d, Y'(d是带前导零的日期) - 如果月份是缩写(比如
Mar 21, 2015):用'M j, Y'(M是英文月份缩写)
内容的提问来源于stack exchange,提问作者Sajith Sajan
相关产品推荐
相关产品推荐

