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

PHP跨年份日期比较问题及日期解析异常求助

解决日期比较与strtotime解析MM-DD-YYYY格式的问题

为什么直接字符串比较无效?

字符串比较是按字符顺序逐位对比的,比如'12-31-2022'和'01-01-2023',字符串层面'1' > '0'会判定前者更大,但实际日期后者更晚,所以这种方式完全不可靠。

为什么strtotime解析08-20-2023返回1970-01-01?

strtotime对xx-xx-xxxx格式的默认解析逻辑是DD-MM-YYYY,08-20-2023会被尝试解析为“20日8月”,但20不是合法月份,解析失败返回false,而false转换为时间戳是0,对应Unix纪元起始日期1970-01-01。

解决方法

1. 使用DateTime类(推荐方案)

DateTime类支持指定格式解析日期,完全避免歧义,且可以直接比较对象:

// 解析单个日期
$date = DateTime::createFromFormat('m-d-Y', '08-20-2023');
if ($date) {
    $timestamp = $date->getTimestamp(); // 获取时间戳
    $formattedDate = $date->format('Y-m-d'); // 转换为标准格式
}

// 比较两个日期
$date1 = DateTime::createFromFormat('m-d-Y', '08-20-2023');
$date2 = DateTime::createFromFormat('m-d-Y', '09-15-2022');

if ($date1 > $date2) {
    echo "08-20-2023 晚于 09-15-2022";
} else {
    echo "09-15-2022 晚于 08-20-2023";
}

2. 兼容strtotime的处理方式

如果必须使用strtotime,可以通过格式转换消除歧义:

  • 把横杠替换为斜杠(strtotime将/分隔的日期识别为MM/DD/YYYY):
    $dateStr = '08-20-2023';
    $timestamp = strtotime(str_replace('-', '/', $dateStr));
    
  • 手动拆分日期重组为标准YYYY-MM-DD格式:
    list($month, $day, $year) = explode('-', '08-20-2023');
    $timestamp = strtotime("$year-$month-$day");
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:37:01