PHP代码误将文件中未来日期判定为过期日期的问题排查
问题分析与解决方案
你的代码有两个核心问题导致了错误的日期判定:
1. 日期解析失效 + 类型不匹配
strtotime()对2018,2,18这种逗号分隔的格式支持不稳定,大概率会返回false(你可以加一句var_dump($date)验证)。- 你把
strtotime()返回的**时间戳(整数)**和DateTime对象直接用<对比,PHP 会做隐式类型转换,结果完全不符合预期。 - 另外,
file()函数读取每行时会保留换行符(\n),$lines[0]实际是2018,2,18\n,这也会干扰日期解析。
2. 修复后的代码
使用 DateTime::createFromFormat() 精确解析自定义日期格式,同时统一用 DateTime 对象做对比,这样更可靠:
<?php $myFile = strtolower('date.txt'); // 读取文件时自动去除换行符和空行 $lines = file($myFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // 先检查文件第一行是否有效 if (empty($lines[0])) { echo '日期文件内容无效'; exit; } // 精确解析"年,月,日"格式的字符串 $expireDate = DateTime::createFromFormat('Y,n,j', $lines[0]); if (!$expireDate) { echo '日期格式解析失败'; exit; } $now = new DateTime(); // 直接对比两个DateTime对象,PHP支持这种操作 if ($now < $expireDate) { echo 'Have not reached date yet.'; } else { echo 'Date in file is old'; } ?>
关键说明
FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES:确保读取的日期字符串没有多余的换行符或空白。DateTime::createFromFormat('Y,n,j', $lines[0]):Y代表4位年份,n代表无前导零的月份,j代表无前导零的日期,完美匹配你的2018,2,18格式。- DateTime 对象之间可以直接用比较运算符(
</>/==)对比,逻辑清晰且不易出错。
内容的提问来源于stack exchange,提问作者The Newbie
相关产品推荐
相关产品推荐

