使用FTPClient获取FTP服务器文件修改时间异常:返回null或时间错误
解决FTP文件修改时间获取异常的问题
我之前也踩过FTP时间获取的坑,给你梳理下可能的原因和可行的解决方案:
一、ftpClient.getModificationTime()返回null的处理
可能的原因及排查
- 服务器不支持MDTM命令:MDTM是FTP协议中专门用于获取文件修改时间的命令,但并非所有FTP服务器都支持。你可以先验证这一点:
boolean supportsMDTM = ftpClient.hasFeature("MDTM"); System.out.println("服务器是否支持MDTM:" + supportsMDTM); - 文件路径格式错误:确保传入的路径是服务器能识别的格式——如果用相对路径,要确认当前工作目录正确;如果是绝对路径,要匹配服务器的路径规则(比如部分Windows FTP服务器用盘符开头,Linux用
/根目录)。
正确解析MDTM响应的代码示例
如果服务器支持MDTM,返回的响应格式通常是213 YYYYMMDDHHMMSS,可以这样解析:
String modTimeResponse = ftpClient.getModificationTime("/your/target/file.txt"); if (modTimeResponse != null && modTimeResponse.startsWith("213 ")) { // 截取纯时间部分 String timeStr = modTimeResponse.substring(4).trim(); // 根据服务器时区解析,比如服务器用EST时区(对应ID:America/New_York) SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); sdf.setTimeZone(TimeZone.getTimeZone("America/New_York")); Date correctModTime = sdf.parse(timeStr); System.out.println("正确修改时间:" + correctModTime); }
二、FTPFile.getTimestamp().getTime()返回错误时间的解决
这个问题基本都是时区不匹配或者旧版本库的bug导致的:FTPFile.getTimestamp()默认用本地时区解析,但FTP服务器返回的是服务器本地时间,两者时区不一致就会出现离谱的时间偏差(比如你遇到的2004年问题,大概率是旧版本库的时区解析bug)。
解决步骤
- 先确认服务器时间是否正常:用FileZilla等FTP客户端手动查看文件修改时间,排除服务器本身时间异常的情况。
- 升级Apache Commons Net库:3.0之前的旧版本存在时区解析的bug,升级到最新稳定版能解决很多这类问题。
- 手动指定服务器时区解析:
FTPFile[] fileList = ftpClient.listFiles("/your/target/file.txt"); if (fileList != null && fileList.length > 0) { FTPFile targetFile = fileList[0]; // 设置服务器所在的时区,比如EST对应"America/New_York" TimeZone serverTimeZone = TimeZone.getTimeZone("America/New_York"); Calendar fileTimestamp = targetFile.getTimestamp(); fileTimestamp.setTimeZone(serverTimeZone); Date correctTime = fileTimestamp.getTime(); System.out.println("正确修改时间:" + correctTime); } - 尝试用TZ命令指定时区:如果服务器支持,可以先发送时区命令让服务器返回指定时区的时间:
ftpClient.sendCommand("TZ", "UTC"); // 设置服务器返回UTC时间 // 之后再调用listFiles或getModificationTime
额外注意事项
- 部分老旧FTP服务器的LIST命令返回的时间格式不标准(比如只显示月/日/年,没有小时分钟),这种情况下
FTPFile.getTimestamp()的准确性极低,优先使用MDTM命令(如果服务器支持)。 - 确保FTP连接处于正常状态,比如被动模式(PASV)是否开启,避免因为连接问题导致命令执行失败。
内容的提问来源于stack exchange,提问作者Ayush
相关产品推荐
相关产品推荐

