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

使用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)。

解决步骤

  1. 先确认服务器时间是否正常:用FileZilla等FTP客户端手动查看文件修改时间,排除服务器本身时间异常的情况。
  2. 升级Apache Commons Net库:3.0之前的旧版本存在时区解析的bug,升级到最新稳定版能解决很多这类问题。
  3. 手动指定服务器时区解析:
    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);
    }
    
  4. 尝试用TZ命令指定时区:如果服务器支持,可以先发送时区命令让服务器返回指定时区的时间:
    ftpClient.sendCommand("TZ", "UTC"); // 设置服务器返回UTC时间
    // 之后再调用listFiles或getModificationTime
    

额外注意事项

  • 部分老旧FTP服务器的LIST命令返回的时间格式不标准(比如只显示月/日/年,没有小时分钟),这种情况下FTPFile.getTimestamp()的准确性极低,优先使用MDTM命令(如果服务器支持)。
  • 确保FTP连接处于正常状态,比如被动模式(PASV)是否开启,避免因为连接问题导致命令执行失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:09:57