如何使用PHP获取Windows系统下图片或视频的真实创建时间
问题原因分析
Windows资源管理器中针对图片、视频类媒体文件显示的「date」列,不是系统层面存储的文件创建/修改/访问时间,而是媒体文件自身内置元数据中记录的生成时间:图片对应EXIF信息里的拍摄时间,视频对应容器元数据里的内容创建时间。
你通过PHP的filemtime/filectime/fileatime获取到的2021年8月时间,是这批文件被拷贝到当前存储磁盘的时间,属于系统级的文件属性,和媒体本身的生成时间是完全独立的两个数据。
PHP获取该日期的实现方法
分两类文件处理:
图片类文件(JPG、TIFF等支持EXIF的格式)
- 先开启PHP的
exif扩展:编辑php.ini配置文件,删除extension=exif前的注释分号,重启服务生效。 - 调用
exif_read_data()函数读取EXIF中的DateTimeOriginal字段即可,示例代码如下:
$exif = exif_read_data('你的图片路径.jpg'); $mediaCreateDate = isset($exif['DateTimeOriginal']) ? $exif['DateTimeOriginal'] : '无内置生成时间'; echo $mediaCreateDate;
视频类文件
PHP原生不支持读取视频元数据,需要借助FFmpeg配套的ffprobe工具实现:
- 先在Windows系统安装FFmpeg,将FFmpeg的bin目录加入系统环境变量PATH,确保命令行可以直接调用
ffprobe。 - 通过PHP执行系统命令调用ffprobe读取视频元数据中的
creation_time字段,示例代码如下:
$videoPath = '你的视频路径.mp4'; $cmd = "ffprobe -v error -show_entries format_tags=creation_time -of default=noprint_wrappers=1:nokey=1 \"$videoPath\""; $mediaCreateDate = trim(shell_exec($cmd)); echo $mediaCreateDate ?: '无内置生成时间';
注意事项
- 经过二次压制、转码的媒体文件可能丢失内置元数据,该场景下只能回退使用系统级的文件时间属性。
- 批量处理文件时建议直接写ffprobe的绝对路径,避免环境变量配置异常导致命令调用失败。
内容的提问来源于stack exchange,提问作者Werner
相关产品推荐
相关产品推荐

