PHP中如何校验多种格式的日期是否合法?
如何在PHP中校验多种格式的日期有效性
我明白你的需求——要校验各种非数字标准格式的日期,比如带序数后缀(像31st)、英文月份名的这类,checkdate()确实不够用,因为它只认数字格式的月、日、年。这里给你一个实用的解决方案,利用PHP的DateTime类来处理多种格式的日期校验:
核心思路:用DateTime::createFromFormat()解析并验证
DateTime::createFromFormat()允许你指定日期格式来解析字符串,关键是解析后要验证输出是否和原输入一致——因为这个函数会自动“修复”无效日期(比如把31-02-2018转成2018-03-03),所以必须做这一步验证才能确保日期真正有效。
通用校验函数
下面是一个可以支持多种格式的通用校验函数,你可以根据需求添加或修改格式数组:
function validateDate($date, $formats = ['d-m-Y', 'jS-F-Y', 'D-M-Y']) { // 遍历所有支持的格式,逐个尝试解析 foreach ($formats as $format) { // 按指定格式解析日期 $dateObj = DateTime::createFromFormat($format, $date); // 两个条件:解析成功,且解析后的日期按原格式输出和输入完全一致 if ($dateObj && $dateObj->format($format) === $date) { return true; } } return false; }
测试你的示例用例
用你给出的示例测试一下,结果完全符合预期:
// 测试用例 var_dump(validateDate('01-01-2018')); // bool(true) var_dump(validateDate('31-02-2018')); // bool(false) var_dump(validateDate('30 February 2018')); // bool(false)(2月没有30号) var_dump(validateDate('31st Feb 2018')); // bool(false)(2月没有31号) var_dump(validateDate('31st March 2018')); // bool(true) var_dump(validateDate('31-04-2018')); // bool(false)(4月没有31号)
格式说明与扩展
你可以根据需要扩展$formats数组,这里解释几个你用到的格式含义:
d-m-Y:两位日期-两位月份-四位年份(比如01-01-2018)jS-F-Y:无前置零日期+序数后缀+完整英文月份+四位年份(比如31st March 2018)D-M-Y:缩写星期几-缩写月份-四位年份(比如Wed-Mar-2018)
如果需要支持其他语言的月份名(比如你示例里的Februari是荷兰语),可以先设置系统语言环境:
// 设置荷兰语环境(需服务器安装对应语言包) setlocale(LC_TIME, 'nl_NL'); // 然后用对应格式解析 var_dump(validateDate('30 Februari 2018', ['j F Y'])); // bool(false)
为什么比checkdate()好用?
checkdate()只能接收数字的月、日、年参数,而DateTime::createFromFormat()可以处理任意自定义格式的日期字符串,覆盖你需要的所有场景,灵活性拉满。
内容的提问来源于stack exchange,提问作者Mít
相关产品推荐
相关产品推荐

