上周整理一个老照片文件夹时,我遇到了一个特别窝火的场景:几百张扫描件文件名清清楚楚,内容也是十年前的,但在资源管理器里按修改日期排序,它们却齐刷刷地排到了今天。原因很简单——扫描仪在导出文件时,把每个文件的创建日期和修改日期都写成了“现在”。这种时候,手动右键属性根本没用,因为Windows压根没给你改创建日期的入口。我前后试了十几种小工具,最后只留下了5款,覆盖了Windows和Mac、单文件和批量处理、图形界面和命令行。这篇文章就把它们完整过一遍,顺便聊聊时间戳的原理和实操中的坑,照着做基本不会出错。不论你是要整理家庭照片,还是要修改项目文档的归档时间,这套方案都够用。
1. 时间戳里藏着的秘密:为什么“创建日期”和“修改日期”能被改动
1.1 三个时间戳到底是什么
在NTFS、APFS这类现代文件系统里,每个文件至少带着三张“时间卡片”:
- 创建时间(Creation Time / Birth Time):文件第一次在文件系统里出现的时间,Windows里显示为“创建日期”。
- 修改时间(Modification Time / Updated Time):文件内容最后被写入的时间,Windows里显示为“修改日期”。
- 访问时间(Access Time):文件最后一次被打开、读取的时间。
这三个时间分别被不同操作更新。创建时间在“另存为”新文件或复制文件时生成;修改时间是每次保存内容时刷新;访问时间是读取时更新。很多人只关心前两个,因为它们直接决定文件在资源管理器里的排序结果。
很多人担心改时间戳会不会损坏文件。放心,修改的是元数据,文件内容一个字节都不会动。你可以把文件比喻成快递包裹上的标签,时间是标签上的一行字,包裹里的东西完全没变。所以放心折腾,但要注意后面讲到的备份。
1.2 为什么属性面板只显示不能改
Windows的资源管理器里右击文件选择“属性”,能看到“创建时间”“修改时间”等字段,但这些字段全部是只读的。macOS的“显示简介”也一样,信息展示得很清楚,但没有地方让你点“编辑”。
原因是文件系统没有向普通用户开放“可视化修改时间戳”的入口。修改时间戳属于高级文件系统操作,系统担心普通用户误操作导致排序、同步、审计异常,所以默认不提供界面。要改,只能通过系统API调用,或者直接操作文件系统元数据。第三方工具本质上就是帮你把这些API操作包装成人话,让你点鼠标就能完成。
1.3 谁在用这个功能
我把真实的用户场景归了一下类,你可以对照自己属于哪一类:
- 照片整理党:扫描仪、相机、手机传输文件时,时间戳被重置为传输时间,导致相册排序乱七八糟,需要根据照片内容或文件名重新设置拍摄日期。
- 文档归档族:合同、简历、项目文档的电子档,希望文件系统时间和文档实际编写或签署时间一致,方便以后按时间检索。
- 开发与测试人员:单元测试或上传逻辑里需要固定时间戳,用来模拟不同时间点的文件状态。
- 网盘同步受害者:从网盘下载的整个文件夹,所有文件的时间都变成了下载时间,需要统一修正。
- 自媒体与素材管理:批量输出素材时希望时间戳统一,方便交接和归档。
这些都是合理用途。需要提醒的是,如果是用于维权、报销、考勤等需要法律效力的场景,单靠修改文件时间戳是站不住脚的,因为时间戳可以被修改,不能作为唯一证明。在合法合规范围内使用,它更多是效率工具。
2. 五款工具逐个上手:从系统自带命令到右键菜单小工具
先放一个对比表,方便你按自己的情况直接选:
| 工具 | 平台 | 是否需要安装 | 适合场景 | 一句话点评 |
|---|---|---|---|---|
| PowerShell | Windows | 系统自带 | 单文件/批量,命令控 | 零安装,可控性最强 |
| BulkFileChanger | Windows | 绿色免安装 | 成百上千个文件批量 | 轻量迅速,NirSoft老牌出品 |
| Attribute Changer | Windows | 需安装 | 右键点击直接改 | 集成到资源管理器,功能全 |
| NewFileTime | Windows | 绿色免安装 | 新手、偶尔用一次 | 拖拽式操作,无学习成本 |
| touch + SetFile | macOS | 需装开发者工具 | Mac上临时修改 | 系统自带组合,稳定可靠 |
2.1 Windows零安装方案:PowerShell精准修改
如果你的需求只是修改一两个文件,或者你不想在电脑上装任何额外软件,PowerShell是最省事的方案。打开文件所在文件夹,在文件夹路径框里输入powershell,回车,就直接进入了当前目录的PowerShell窗口。
先看单文件版本。假设要修改D:\示例\文档.docx的创建时间为2023年5月1日10:00:00,修改时间为2023年5月2日18:30:00,执行:
$file = Get-Item "D:\示例\文档.docx" $file.CreationTime = "2023-05-01 10:00:00" $file.LastWriteTime = "2023-05-02 18:30:00"执行完,再打开文件属性,就会发现时间已经变了。这里的关键点是,Get-Item取到的文件对象本身带有时间属性,给属性赋新值就能写回去。需要说明的是,PowerShell默认使用本地时区,直接填本地时间即可。
批量修改也很简单。比如把当前目录下所有.jpg文件的创建时间和修改时间统一设为某个时间:
Get-ChildItem "D:\照片\*.jpg" | ForEach-Object { $_.CreationTime = "2023-05-01 12:00:00" $_.LastWriteTime = "2023-05-01 12:00:00" }使用ForEach-Object,是因为每个文件对象都要单独赋值。这条命令不递归子目录,如果文件夹是嵌套的,需要加-Recurse。实测下来,PowerShell修改上千个文件也是秒级完成。唯一的门槛是命令语法,对完全不碰命令行的用户,可以先从图形工具开始。
2.2 批量处理上千个文件:BulkFileChanger
BulkFileChanger是NirSoft的一款免费绿色工具,单文件、免安装,解压就能用。它的强项是批量:把几百上千个文件拖进去,一次性改完。
操作流程是这样的:
- 打开
BulkFileChanger.exe,界面是一个空列表和菜单栏。 - 把需要修改的文件或文件夹直接拖入列表窗口;也可以点菜单
File -> Add Files选择文件。 - 选中列表里的文件(全选可以用
Ctrl+A)。 - 点击菜单
Actions -> Change Timestamps,弹窗里有几个时间字段,包括Created、Modified、Accessed。勾选你想改的字段,填入目标时间,点击Do It。
它的时间字段区分得很清楚,支持只改创建时间、只改修改时间或一起改。实测批量处理一千个文件时没有明显卡顿。另一个特点是可以保存文件列表为配置,之后重新加载,方便对同一批文件做二次调整。
我建议下载时认准NirSoft官网,选择对应自己系统的32位或64位版本。这个工具是英文界面,但单词就那么几个,第一次拿翻译软件对照一下就行,日常操作完全不会有障碍。
2.3 右键直接改:Attribute Changer
Attribute Changer不是独立操作界面,而是装好后直接集成到Windows资源管理器的右键菜单里。你选中一个或多个文件,右键,选择“更改属性”或“Change Attributes”,就能进入修改面板。这种方式的好处是符合日常操作直觉:不用专门打开某个软件,在文件所在位置就能完成修改。
在面板里找到“日期和时间”区域,勾选“修改时间”“创建时间”或“访问时间”,填写新时间,点确定即可。它同样支持文件夹递归处理:如果你右键一个文件夹,勾选“包含子文件夹”,整个目录树下所有文件都会按规则修改,省去写脚本的麻烦。
另外,Attribute Changer有“按规则偏移时间”的功能,比如把所有文件的创建时间提前30天,或把修改时间加2小时。这个功能在修正网盘下载文件时特别实用。使用时注意安装包可能会有附加选项,建议在安装过程中仔细看每一步,取消非必要的捆绑项目。这是一个老牌工具,功能很全,但正因为功能多,新手进去容易看花眼,第一次只用时间戳那部分就好。
2.4 拖拽式操作:NewFileTime
NewFileTime是一个绿色免安装小工具,界面简单到几乎没有学习成本:上半部分是要设置的日期和时间,下半部分是文件列表。把文件拖进去,设置好时间,点一下按钮就完成。
这个工具特别适合“偶尔改一两个文件”的人。它支持修改创建时间、修改时间和访问时间,也支持批量处理。你还可以把常用的时间保存为预设,下次直接调用。如果你不想记住任何菜单按钮,只想打开软件、拖文件、改时间,NewFileTime是首选。
实际测试中,它修改文件时间戳速度很快,文件被其他程序占用时会有提示。界面支持多国语言,在软件设置里可以切换成简体中文,这对小白就更友好了。如果只是改创建日期和修改日期,其他高级选项完全可以忽略。
2.5 Mac电脑怎么改:touch和SetFile组合
Mac上没有Windows那种现成的右键时间戳工具,但系统自带了两条命令,组合起来就能覆盖所有时间戳字段。打开“终端”,先用touch修改“修改时间”和“访问时间”,再用SetFile修改“创建时间”。
touch的常见用法是:
touch -m -t 202305011200.00 /path/to/file-m表示只改修改时间,-t后面的格式是[[CC]YY]MMDDhhmm[.ss],上面例子就是2023年5月1日12:00:00。如果想改访问时间,把-m换成-a。
SetFile修改创建时间的格式更接近日常习惯:
SetFile -d '05/01/2023 12:00:00' /path/to/file-d后面的日期格式是MM/DD/YYYY HH:MM:SS。SetFile 不属于系统默认自带,需要在终端运行xcode-select --install,安装Apple Command Line Tools 后才会有。
我第一次在Mac上改创建时间时,只用了touch,结果发现创建时间纹丝不动,一脸懵。后来才知道touch只管修改时间和访问时间,创建时间需要SetFile。所以如果你只用到其中一条命令,很容易误以为Mac改不了创建时间。另外,文件路径带空格时,要用引号包起来:
SetFile -d '05/01/2023 12:00:00' "/Users/你的用户名/Desktop/老照片.jpg"这套命令方案对小白最友好的一点是:它们都是苹果官方工具,不存在兼容性和流氓软件风险。缺点是需要记住几条命令,但按上面抄就行。
3. 实际操作中的经验:五个最容易踩的坑和应对方法
3.1 权限不够导致改完没反应
第一个坑是权限。当你修改C:\Program Files或系统备份目录下的文件时,PowerShell或图形工具可能提示成功,但实际上没变。这是因为修改需要写文件系统元数据的权限。遇到这种情况,要么以管理员身份重新打开终端或软件,要么先把文件复制到自己的用户目录,改完再移动回去。
另外,如果你修改的是FAT32/U盘上的文件,这个文件系统对创建时间的支持很弱,工具可能只能改修改时间,创建时间怎么改都变不了。U盘格式化时如果选了exFAT,创建时间支持会好一些,但仍然和NTFS有差异。我建议批量修改前,先确认文件所在分区是NTFS或APFS。
3.2 日期格式和时区不一致
不同工具对日期格式的要求不一样。PowerShell接受yyyy-MM-dd HH:mm:ss,SetFile要求MM/DD/YYYY HH:MM:SS,BulkFileChanger用图形控件相对安全,但如果是命令行参数,就得特别注意格式。填错格式时,有些工具会报错,有些则会静默地把时间设为当前时间,这是最坑的——你回头一看,时间全变成“刚才”了。
时区也要统一。这些工具默认按本地时区解释时间,如果你的电脑时区是中国标准时间,填的就是中国时间。但如果你通过远程桌面操作的服务器时区是UTC,填同一串时间,得到的结果可能和预期差8小时。所以改完以后,一定要立刻看文件属性确认。
3.3 忘了保留原始时间戳
我在多次操作后得出的最重要教训:改时间戳前,先记录原始时间。这不是怕改坏文件,而是因为很多场景下,你可能改完发现新时间不对,想还原却记不清原始时间是多少了。用PowerShell可以先把所有文件的原始时间导出成CSV:
Get-ChildItem "D:\示例" -Recurse | Select-Object FullName, CreationTime, LastWriteTime | Export-Csv "D:\备份时间戳.csv" -NoTypeInformation -Encoding UTF8导出以后,哪怕改错了,也能按表里的原值重新写回去。如果是图形工具,比如BulkFileChanger,它本身有简单的撤销功能,但不如这份表格直观。所以“先导出、再修改、后验证”是我一直推荐的三步走。
3.4 文件被占用或资源管理器缓存作怪
如果你用Word打开了一个文档,或者视频播放器正在读取某个视频,这时去修改时间戳,很大概率会失败。这是正常现象,因为文件对象被系统锁定。关掉对应程序再改就行。
还有一种情况:文件属性里已经显示修改成功,但资源管理器排序还是老样子。这是资源管理器缓存造成的。按F5刷新通常可以解决,如果还是没有,可以重启一下资源管理器。在任务管理器里找到“Windows 资源管理器”,右键选择“重新启动”,窗口会恢复,缓存也会被清理。这招对图标、时间显示不更新都很管用。
3.5 批量修改前一定要做小规模测试
批量操作最忌讳一上来就全选。我习惯先用一两个文件做实验,修改后打开属性,逐项检查创建时间、修改时间是否都符合预期。确认没问题后,再全量操作。尤其是文件夹递归修改,一旦错了,影响范围会成百上千,还原成本很高。
还有一个细节:如果你用工具修改文件夹的时间戳,注意资源管理器里看到的文件夹“修改日期”有时不会立刻刷新。这和文件夹索引有关,不影响实际值,重开资源管理器窗口一般就好了。
4. 批量修改和自动化:让重复劳动变成一键执行
4.1 按文件名规则自动设置时间戳
很多时候,文件名里其实包含了真正的时间,比如照片文件IMG_20230501_120000.jpg,或导出的日志report-2023-05-01.txt。这种场景下,逐个手动填时间纯属浪费生命。用PowerShell写个小循环,就能自动解析文件名,并设置对应时间戳。
Get-ChildItem "D:\照片\*.jpg" | ForEach-Object { if ($_.BaseName -match '(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})') { $dt = [datetime]::new( [int]$Matches[1], [int]$Matches[2], [int]$Matches[3], [int]$Matches[4], [int]$Matches[5], [int]$Matches[6] ) $_.CreationTime = $dt $_.LastWriteTime = $dt } }这一段会扫描D:\照片下的.jpg文件,匹配类似IMG_20230501_120000.jpg这样的名字,再把创建和修改时间都设置为2023年5月1日12:00:00。正则表达式看起来复杂,但其实每一组括号对应一个字段:年、月、日、时、分、秒。复制改一下路径和文件名模式就能用。
4.2 批量整体偏移:修正网盘同步后的时间漂移
网盘同步导致的时间异常,通常不是“某个文件错了”,而是“所有文件的时间都变成了同一个时间”。这种情况适合使用整体偏移功能。在Attribute Changer或NewFileTime里都有“相对时间调整”选项,比如把每个文件的创建时间增加30天,或者减少12小时。
用PowerShell实现也很简单。把当前目录下所有文件的修改时间统一加两天:
Get-ChildItem "D:\下载文件" -Recurse | ForEach-Object { $_.LastWriteTime = $_.LastWriteTime.AddDays(2) }注意,这种整体偏移操作会覆盖原值,执行前务必先导出备份。我实际遇到过把N天前的文件全部变成同一时间后,想恢复却无据可查的情况。所以哪怕工具提供了撤销,我也都会额外导一份CSV。
4.3 我常用的验证方法:改完不等于完事
操作完成后,我会用一条命令把修改结果列出来,和预期对比:
Get-ChildItem "D:\照片" | Select-Object Name, CreationTime, LastWriteTime | Format-Table在Mac上则用:
stat -f "%N 创建时间:%SB 修改时间:%Sm" "/path/to/file"stat命令会列出文件的详细时间信息,方便确认。如果显示的结果不对,立刻用备份CSV还原。验证这一步看起来多花半分钟,却能避免“改完很久以后发现时间不对”的返工。
最后分享一点我自己的使用习惯。临时改一两个文件,我基本都用NewFileTime,因为打开就拖,不需要过脑子;批量处理或在测试环境里,我会用PowerShell脚本,因为可以附带备份和验证;如果涉及右键菜单操作或要改整个文件夹,Attribute Changer最顺手;在Mac上则直接用SetFile套装。工具不在多,顺手就行。还有一个小技巧:改完文件时间后,在资源管理器里按“修改日期”排一次序,如果顺序和你的预期一致,基本这次操作就成功了。希望这篇文章能帮你少走点弯路,早点儿下班。