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; } }
额外排查步骤
验证传入的$CheckDate正确性:在函数开头添加打印语句,确认日期格式和值:
echo "待校验日期:" . $CheckDate->format('d/m/Y H:i:s T') . "\n";确保输出为
23/09/1793 00:00:00 UTC(或对应时区的正确时间),避免因误传日期(比如写成1973年)导致判断错误。确认DateTime对象有效性:检查起始日期是否解析成功,避免格式匹配错误:
var_dump($BeginFrDate, $EndFrDate);如果返回
false,说明日期格式与解析字符串不匹配,需调整格式参数。
内容的提问来源于stack exchange,提问作者Polleke1959
相关产品推荐
相关产品推荐

