Node.js中fs.statSync返回的文件时间(如birthtime)为何与系统显示不符?
问题解答
1. 时间戳不符的原因
- 时区差异:Node.js返回的
birthtime等时间戳是UTC标准时间(带Z后缀),而Windows文件属性显示的是本地时区时间,直接对比会存在时差。 - Windows文件系统的时间逻辑:Windows的
birthtime指文件在当前系统的创建时间,如果照片是从相机、其他设备复制到本地的,这个时间会是复制完成的时间,而非照片原始的拍摄时间。 - 文件系统时间≠照片拍摄时间:你看到的系统中照片的“正确时间”大概率是照片EXIF元数据里的拍摄时间,而非文件系统层面的时间戳,
fs.statSync只能读取文件系统的时间,无法直接获取EXIF信息。
2. 获取准确时间的方案
方案一:获取文件系统的本地时区时间
如果需要的是文件在系统中的显示时间,可以直接使用Node.js提供的带Local后缀的属性,或者手动转换UTC时间:
const stats = fs.statSync(absPathOfFile); // 直接获取本地时区的时间戳 const localDates = [ stats.birthtimeLocal, stats.ctimeLocal, stats.mtimeLocal, stats.atimeLocal, ]; console.log(localDates);
也可以手动转换UTC时间到本地时区:
const utcTime = stats.birthtime; const localTime = new Date(utcTime.toLocaleString()); console.log(localTime);
方案二:获取照片真实拍摄时间(读取EXIF元数据)
如果需要的是照片本身的拍摄时间,必须读取照片的EXIF元数据,这里以exifreader库为例(全平台适配):
- 安装依赖:
npm install exifreader
- 读取拍摄时间的代码:
const fs = require('fs'); const ExifReader = require('exifreader'); function getPhotoCaptureTime(filePath) { const buffer = fs.readFileSync(filePath); const tags = ExifReader.load(buffer); // DateTimeOriginal 是照片拍摄的原始时间字段 const captureTimeStr = tags.DateTimeOriginal?.description; return captureTimeStr ? new Date(captureTimeStr) : null; } // 使用示例 const captureTime = getPhotoCaptureTime(absPathOfFile); console.log(captureTime);
全平台适配注意点
- 类Unix系统(Linux/macOS)的
birthtime定义为文件创建时间,同样可以用birthtimeLocal获取本地时区时间。 - 读取EXIF的方式不受操作系统限制,是跨平台获取照片真实拍摄时间的可靠方案。
内容的提问来源于stack exchange,提问作者Native Dev
相关产品推荐
相关产品推荐

