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

如何计算文件创建日期与当前日期的天数差?PHP实现求助

正确计算文件日期与当前日期的差值

你的代码核心问题是直接对字符串格式的日期做减法运算,PHP会把字符串强制转换为数值,结果完全不符合预期。另外需要注意:filemtime获取的是文件的最后修改时间,不是创建时间,不同系统获取创建时间的方式有差异。

错误原因分析

  • $crdatefile = date("Y-m-d H:i:s",filemtime($_filename)) 和 $date1 = date("Y-m-d H:i:s") 生成的都是字符串,直接用-相减会得到无意义的数值(比如"2024-05-20" - "2024-05-21"会被转换为2024 - 2024 = 0)。
  • 你提到的DateTime::diff是PHP中处理日期差值的标准方案,应该用时间戳或DateTime对象来计算,而非字符串。

正确实现代码(以文件修改时间为例)

$_filename = realpath('test.txt');
if (file_exists($_filename)) {
    // 获取文件最后修改时间戳,转换为DateTime对象
    $fileModifyDate = new DateTime();
    $fileModifyDate->setTimestamp(filemtime($_filename));
    
    // 当前时间的DateTime对象
    $currentDate = new DateTime();
    
    // 计算两个日期的差值,得到DateInterval对象
    $dateDiff = $currentDate->diff($fileModifyDate);
    
    // 获取差值的总天数(正数表示当前时间晚于文件修改时间)
    $daysDiff = $dateDiff->days;
    
    echo "相差天数:{$daysDiff}____";
    
    if ($daysDiff > 1) {
        // unlink($_filename);
        echo '文件已删除____';
    }
    echo '执行后的文件状态____';
}

获取文件创建时间的差异处理

  • Windows系统:可以用filectime获取文件创建时间:
    $fileCreateDate = new DateTime();
    $fileCreateDate->setTimestamp(filectime($_filename));
    
  • Linux/Unix系统(PHP 7.1+):filectime返回的是文件元数据(如权限)的修改时间,需要用stat获取创建时间:
    $fileStat = stat($_filename);
    $fileCreateDate = new DateTime();
    $fileCreateDate->setTimestamp($fileStat['birthtime']);
    

关键注意事项

  • DateTime::diff返回的DateInterval对象包含y(年)、m(月)、d(日)、h(时)等精确差值字段,无需手动计算时间戳差值,避免闰年、不同月份天数的坑。
  • 若坚持用时间戳计算,需将两个时间都转为时间戳再相减:
    $fileTime = filemtime($_filename);
    $currentTime = time();
    $secondsDiff = abs($currentTime - $fileTime);
    $daysDiff = round($secondsDiff / (60 * 60 * 24));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:20:58