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

PHP strtotime()返回1970年日期且与time()比较异常问题求助

PHP日期字符串转换及比较异常问题解决

问题根源

  1. strtotime返回1970年日期的原因
    PHP的strtotime()函数对斜杠/分隔的日期默认识别为mm/dd/YYYY格式,你传入的24/12/2021中24被判定为无效月份,函数返回false,传入date()函数后会被转为时间戳0对应的1970-01-01日期。
  2. 替换斜杠后比较逻辑异常的原因
    把/替换为-之后,strtotime()会识别为dd-mm-YYYY格式,可正常转换时间戳,但你后续比较的是d/m/Y h:i:s格式的字符串,字符串比较是逐位对比字符ASCII值,不是按日期大小逻辑,必然会出现判断错误。比如01/10/2024字符串会比31/12/2023小,因为开头字符0<3,但实际日期前者更晚。

额外注意:date()格式中h为12小时制,H为24小时制,如果你的原始日期用24小时制计数,格式化时请使用H避免时间偏差

正确解决方案

方案1:使用DateTime类指定格式解析(推荐,无歧义)

直接指定输入日期的格式解析,不需要手动替换字符,不会出现格式识别错误:

var_dump($requestOrder->date);
// 按输入的日/月/年 时:分:秒格式解析日期
$requestDate = DateTime::createFromFormat('d/m/Y H:i:s', $requestOrder->date);
var_dump($requestDate->format('d/m/Y H:i:s'));

// 后续日期比较直接用DateTime对象对比即可,逻辑准确
if($requestDate < new DateTime()) {
    // 你的业务逻辑
}

方案2:使用时间戳做数值比较

如果习惯使用时间戳处理,直接对比数值类型的时间戳即可,不要用格式化后的字符串做大小比较:

var_dump($requestOrder->date);
// 替换斜杠后转时间戳
$requestTimestamp = strtotime(str_replace('/', '-', $requestOrder->date));
$requestDateStr = date('d/m/Y H:i:s', $requestTimestamp);
var_dump($requestDateStr);

// 直接比较时间戳数值
if($requestTimestamp < time()) {
    // 你的业务逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:15:06