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

PHP 8日期函数能否处理1792-1806年日期?校验函数返回异常求助

问题排查与解决方案

你的问题出在使用Unix时间戳(timestamp)比较1970年之前的日期。Unix时间戳以1970-01-01 UTC为起点,1970年前的日期会返回负数,虽然数值逻辑上成立,但极易因时区偏差、DateTime对象创建时区不一致等问题出现意外结果。更可靠的方式是直接使用DateTime对象的原生比较运算符。

修复后的函数

function CheckFrDate($CheckDate){
    // 统一指定UTC时区,避免时区偏移干扰日期判断
    $timezone = new DateTimeZone('UTC');
    $BeginFrDate = date_create_from_format('d/m/Y', '22/09/1792', $timezone);
    $EndFrDate = date_create_from_format('d/m/Y', '22/09/1806', $timezone);
    
    // 将传入的校验日期转换为同一时区
    $CheckDate->setTimezone($timezone);
    
    // 直接比较DateTime对象,这是PHP推荐的日期比较方式
    if ($CheckDate > $BeginFrDate && $CheckDate < $EndFrDate) {
        return 1;
    } else {
        return -1;
    }
}

额外排查步骤

  1. 验证传入的$CheckDate正确性:在函数开头添加打印语句,确认日期格式和值:

    echo "待校验日期:" . $CheckDate->format('d/m/Y H:i:s T') . "\n";
    

    确保输出为23/09/1793 00:00:00 UTC(或对应时区的正确时间),避免因误传日期(比如写成1973年)导致判断错误。

  2. 确认DateTime对象有效性:检查起始日期是否解析成功,避免格式匹配错误:

    var_dump($BeginFrDate, $EndFrDate);
    

    如果返回false,说明日期格式与解析字符串不匹配,需调整格式参数。

内容的提问来源于stack exchange,提问作者Polleke1959

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:35:20