files.setlastmodifiedtime() 用于修改文件最后修改时间戳,需传入真实可写文件的path和非null filetime,依赖文件系统支持,不支持创建时间修改,windows目录可能无效。

Java 中 Files.setLastModifiedTime() 可以修改文件的最后修改时间戳,但要注意:它修改的是“最后修改时间(lastModifiedTime)”,不是“创建时间”或“最后访问时间”,且该操作依赖底层文件系统支持,部分系统(如 Windows NTFS)不支持精确设置创建时间。
核心用法:传入 Path 和 FileTime
该方法签名是:
public static void setLastModifiedTime(Path path, FileTime time) throws IOException
关键点:
- Path 必须指向一个真实存在的、可写的普通文件(不能是目录或符号链接,否则抛异常)
- FileTime 是纳秒精度的时间对象,不能为 null
- 调用需有对应文件的写权限,否则抛
AccessDeniedException
如何构造目标 FileTime
常用方式是基于 Instant 或毫秒值构建:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 设为当前时间:
FileTime.from(Instant.now()) - 设为指定毫秒(如 2020-01-01 12:00:00):
FileTime.fromMillis(1577880000000L) - 设为某 LocalDateTime(需指定时区):
FileTime.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())
注意:FileTime.fromMillis() 接收的是自 Unix 纪元(1970-01-01T00:00:00Z)起的毫秒数,和 new File("x").setLastModified() 的参数单位一致,兼容性好。
典型使用示例
以下代码将文件 log.txt 的最后修改时间设为 2023 年 10 月 1 日上午 9 点:
Path file = Paths.get("log.txt");
FileTime targetTime = FileTime.fromMillis(1696122000000L); // 2023-10-01 09:00:00
Files.setLastModifiedTime(file, targetTime);
如果想设为相对时间(比如 1 小时前),可用:
FileTime oneHourAgo = FileTime.from(Instant.now().minus(Duration.ofHours(1)));
Files.setLastModifiedTime(file, oneHourAgo);
常见问题与注意事项
-
Windows 上可能显示不准:资源管理器默认只显示到秒级,且某些版本会四舍五入或缓存时间显示;建议用命令行
dir /T:W或 PowerShellGet-Item log.txt | % LastWriteTime验证 -
无法修改创建时间(creationTime):标准 NIO API 不提供设置创建时间的方法;Windows 下需通过 JNI 或 JNA 调用
SetFileTime,Linux 多数文件系统根本不存储创建时间 - 对目录无效:虽然 API 允许传入目录路径,但实际是否生效取决于 OS。多数情况下只对文件可靠,目录时间通常由系统自动维护
-
时区无关:
FileTime基于 UTC,构造时无需手动处理时区转换
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










