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

Rust与NodeJS获取文件mtime值存在巨大差异问题求助

问题分析与解决方案

核心问题是Node.js与Rust端的时间戳单位不匹配,导致时间计算出现数量级错误:

错误原因拆解

  1. Node.js端:stat.mtime.getTime()返回的是从UNIX纪元开始的毫秒数(13位整数,比如1712345678901)。
  2. Rust端:你的代码错误地将这个毫秒数当作了秒级时间戳来处理。比如你写的event.mtime.duration_since(UNIX_EPOCH)是完全错误的调用(u64类型没有该方法),推测你实际代码可能误用了SystemTime::from_unix_timestamp(该方法接收秒数参数),把毫秒数直接塞进去,相当于把时间往后推了1000倍,自然和本地文件的时间戳差出几十年。

修正后的Rust代码

方式一:直接使用毫秒数对比(最简)

async fn download(event: Event) {
  if let Ok(meta) = dest.metadata().await {
    // Node.js传来的mtime已经是毫秒数,直接使用
    let source_mtime = event.mtime;
    // 本地文件的毫秒级时间戳,转成u64统一类型
    let dest_mtime = meta.modified()?.duration_since(UNIX_EPOCH)?.as_millis() as u64;

    if source_mtime > dest_mtime {
      // 执行下载逻辑
    }
  }
}

方式二:转成SystemTime后再处理(适合需要时间操作的场景)

use std::time::{SystemTime, UNIX_EPOCH, Duration};

async fn download(event: Event) {
  if let Ok(meta) = dest.metadata().await {
    // 将毫秒数转成SystemTime
    let source_time = UNIX_EPOCH + Duration::from_millis(event.mtime);
    // 再转回毫秒数用于对比
    let source_mtime = source_time.duration_since(UNIX_EPOCH).unwrap().as_millis();
    let dest_mtime = meta.modified()?.duration_since(UNIX_EPOCH)?.as_millis();

    if source_mtime > dest_mtime {
      // 执行下载逻辑
    }
  }
}

验证步骤

  1. 在Node.js端打印mtime的值,和Rust端打印的event.mtime对比,确认两者完全一致,排除序列化/反序列化问题。
  2. 打印修正后的source_mtime和dest_mtime,确认两者处于同一数量级(都是13位左右的整数)。

内容的提问来源于stack exchange,提问作者J-Cake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:00:17