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

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库为例(全平台适配):

  1. 安装依赖:
npm install exifreader
  1. 读取拍摄时间的代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:31:21