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
相关产品推荐
相关产品推荐

