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

Windows 10文件管理器预览Zip文件时时区显示异常求助

问题

创建Zip文件时,给所有ZipEntry设置的最后修改时间是当前毫秒时间,但Windows 10文件管理器预览时,显示的是构建服务器所在的WET时区时间;用WinRAR打开同一文件,显示的却是本地时区时间。示例代码如下:

ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipPath + fileName)), Charset.forName("UTF-8"));
ZipEntry zEntry = new ZipEntry("filePath");
zEntry.setLastModifiedTime(FileTime.fromMillis(System.currentTimeMillis()));
zout.putNextEntry(zEntry);

// 文件写入Zip的逻辑(使用BufferedInputStream)

zout.flush();
zout.closeEntry();
解决方法

问题根源在于Zip规范要求文件修改时间存储为UTC时间,但FileTime.fromMillis(System.currentTimeMillis())会把UTC时间戳解析成服务器默认时区的时间存入Zip,导致Windows文件管理器读取时直接用这个服务器时区时间显示,而WinRAR会自动转成本地时区。

修改设置最后修改时间的代码即可:

// 直接用UTC时间生成FileTime
zEntry.setLastModifiedTime(FileTime.from(Instant.now()));

也可以用ZonedDateTime的写法:

ZonedDateTime utcNow = ZonedDateTime.now(ZoneOffset.UTC);
zEntry.setLastModifiedTime(FileTime.from(utcNow.toInstant()));

原理说明:

  • System.currentTimeMillis()本质是UTC时间戳,但FileTime.fromMillis()会结合系统默认时区生成FileTime,导致Zip里存的是服务器时区的时间值。
  • Instant.now()直接获取UTC时间的实例,转成FileTime后存入Zip,完全符合Zip规范,Windows文件管理器和WinRAR都会正确将其转换为本地时区显示。

内容的提问来源于stack exchange,提问作者Abhay Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:42:16