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
相关产品推荐
相关产品推荐

