filetime 是 java nio.2 中不可变的时间快照,以 100 纳秒精度存储,配合 files.setlastmodifiedtime() 修改文件时间戳,实际写入时按文件系统精度向下取整,并支持从毫秒、纳秒或 instant 构建。
java nio.2 的 filetime 类是操作文件时间戳的核心类型,它本身不直接“修改”文件,而是作为时间值的载体,配合 files.setlastmodifiedtime() 等方法完成精准控制。关键在于理解其不可变性、精度转换规则和系统兼容性。
理解 FileTime 的本质与创建方式
FileTime 是一个不可变的时间快照,内部以纳秒级精度(自 1601 年 1 月 1 日起的 100 纳秒单位)存储,但实际写入文件时会按目标文件系统精度向下取整(如 FAT32 精度为 2 秒,NTFS 通常为 100 纳秒)。创建方式主要有:
- 从毫秒时间戳构建:
FileTime.fromMillis(System.currentTimeMillis()) - 从纳秒时间戳构建:
FileTime.from(Instant.now().getEpochSecond(), nanos, TimeUnit.NANOSECONDS) - 从
Instant构建:FileTime.from(Instant.parse("2026-05-12T13:36:00Z")) - 获取当前系统时间:
FileTime.from(Instant.now())
使用 Files.setLastModifiedTime() 写入时间戳
该方法接收 Path 和 FileTime,返回原 Path 对象(支持链式调用),失败时抛出 IOException。注意以下要点:
- 路径必须存在且可写,否则抛出异常
- 若传入的
FileTime超出文件系统支持范围(如设为公元 1000 年),行为未定义,多数情况直接失败 - 时间会被自动截断为文件系统支持的最小粒度,例如在 FAT32 上设为
2026-05-12T13:36:00.123Z,实际可能存为2026-05-12T13:36:00 - 示例代码:
Path p = Paths.get("report.pdf");<br>FileTime target = FileTime.from(Instant.parse("2026-05-12T08:00:00Z"));<br>Files.setLastModifiedTime(p, target);
读取并验证修改结果
用 Files.getLastModifiedTime() 获取更新后的时间,可用于校验是否成功写入:
- 支持
LinkOption.NOFOLLOW_LINKS避免误读符号链接目标文件的时间 - 返回的
FileTime可转为毫秒:time.toMillis(),或转为Instant:time.toInstant() - 建议在设置后立即读取比对,确认时间已生效,尤其在跨文件系统或低精度设备上
常见陷阱与规避建议
实际开发中容易忽略的细节会影响精度和稳定性:
- 不要依赖
toMillis()反向构造精确到毫秒的FileTime,因为原始FileTime可能含更高精度,反向生成会丢失纳秒部分 - 批量处理多个文件时,避免复用同一个
FileTime实例——虽不可变,但逻辑上应确保每个文件都明确赋予目标时间 - 在 Windows 上注意时区:
FileTime始终基于 UTC,显示时需用DateTimeFormatter指定时区格式化 - 若需同时修改创建/访问时间,NIO.2 不直接支持;需借助
Files.setAttribute()设置"basic:creationTime"或"basic:lastAccessTime"属性(需文件系统支持)










