You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:03:50