Rust与NodeJS获取文件mtime值存在巨大差异问题求助
问题分析与解决方案
核心问题是Node.js与Rust端的时间戳单位不匹配,导致时间计算出现数量级错误:
错误原因拆解
- Node.js端:
stat.mtime.getTime()返回的是从UNIX纪元开始的毫秒数(13位整数,比如1712345678901)。 - 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 { // 执行下载逻辑 } } }
验证步骤
- 在Node.js端打印
mtime的值,和Rust端打印的event.mtime对比,确认两者完全一致,排除序列化/反序列化问题。 - 打印修正后的
source_mtime和dest_mtime,确认两者处于同一数量级(都是13位左右的整数)。
内容的提问来源于stack exchange,提问作者J-Cake
相关产品推荐
相关产品推荐

