PHP如何通过filemtime()计算文件修改时间与当前时间的间隔
可复用文件相对修改时间展示实现方案
实现逻辑
你可以把时间计算、单位匹配、单复数处理的逻辑全部封装为独立全局函数,所有需要展示的位置直接调用函数传入文件路径即可,不需要重复编写零散计算逻辑。
核心逻辑:
- 先做文件存在性、可读性校验,避免文件不存在时抛出运行报错
- 用
filemtime()获取文件修改时间戳,和当前时间戳计算秒级差值 - 按年、月、日、小时、分钟、秒的从大到小粒度匹配时间单位,自动处理单复数格式
- 返回标准化的展示字符串,可直接输出到页面
完整函数代码
/** * 生成文件最后修改时间的相对格式展示文本 * @param string $filePath 要检测的目标文件路径 * @return string 格式化后的展示文本 */ function getFileLastChangeText(string $filePath): string { // 兜底处理:文件不存在或不可读时返回未知状态 if (!file_exists($filePath) || !is_readable($filePath)) { return "Content last changed: unknown"; } $modifyTimestamp = filemtime($filePath); $diffSeconds = time() - $modifyTimestamp; // 时间单位配置,按粒度从大到小排列,每个单位对应秒数 $unitMap = [ ['name' => 'year', 'sec' => 31536000], ['name' => 'month', 'sec' => 2592000], ['name' => 'day', 'sec' => 86400], ['name' => 'hour', 'sec' => 3600], ['name' => 'minute', 'sec' => 60], ['name' => 'second', 'sec' => 1], ]; foreach ($unitMap as $unit) { if ($diffSeconds >= $unit['sec']) { $count = floor($diffSeconds / $unit['sec']); // 数值不为1时自动补复数后缀s $unitName = $count != 1 ? $unit['name'] . 's' : $unit['name']; return sprintf("Content last changed: %d %s", $count, $unitName); } } return "Content last changed: just now"; }
调用方式
把函数放在项目公共引入文件中,原来的内联输出代码直接替换为函数调用即可:
<h6 style="text-align: right"> <?php echo getFileLastChangeText("file.js"); ?> </h6>
效果说明
- 修改时间间隔30秒:输出
Content last changed: 30 seconds - 修改时间间隔5分钟:输出
Content last changed: 5 minutes - 修改时间间隔2小时:输出
Content last changed: 2 hours - 修改时间间隔1天:输出
Content last changed: 1 day(自动适配单数格式) - 刚修改的文件会返回
Content last changed: just now - 文件不存在/无读取权限时返回
Content last changed: unknown,不会中断页面运行
内容的提问来源于stack exchange,提问作者Codec737
相关产品推荐
相关产品推荐

