法国客户端与德国服务器延迟计算异常(负值)求助
嘿,我来帮你排查这个延迟计算的问题——你现在的核心问题出在时间戳的时区处理和单位转换上,咱们一步步理清楚:
1. 客户端timeSent的计算逻辑完全错了
new Date().getTime()返回的已经是UTC标准的毫秒时间戳(从1970年1月1日UTC零点开始累计的毫秒数),而getTimezoneOffset()返回的是当前时区与UTC的分钟差值(比如法国处于UTC+1时区时,这个值是-60,意思是本地时间比UTC早60分钟)。
你现在的代码直接把分钟数加到毫秒时间戳上,不仅单位没转换(分钟要转成毫秒得乘60000),更关键的是:UTC时间戳本身就不需要做时区偏移调整!正确的timeSent应该直接用dateSent.getTime(),不需要额外操作:
if (response.type === HttpEventType.Sent) { const dateSent = new Date(); const timeSent = dateSent.getTime(); // 直接拿UTC毫秒时间戳就对了 console.log(timeSent); }
2. 服务器返回值与客户端解析的对齐有歧义
Java里的new Date()本质也是UTC时间戳对应的日期对象,但直接返回它的话,后端框架可能会把它序列化成ISO格式字符串(比如2024-05-20T12:34:56.789Z),客户端用new Date(response.body.dateReceived)解析时,如果后端没明确标记时区,偶尔会出现解析偏差。
更稳妥的做法是让服务器直接返回UTC毫秒数,彻底避免解析问题:
// 服务器端改成返回毫秒时间戳 return new Date().getTime();
然后客户端直接用返回的数字作为timeReceived:
else if (response instanceof HttpResponse) { const timeReceived = response.body; // 直接拿服务器返回的UTC毫秒数 console.log(timeReceived); }
为什么会出现负数延迟?
你当前的timeSent错误地把时区偏移的分钟数(没转毫秒)加到了UTC时间戳上,导致timeSent的数值反而比服务器返回的timeReceived大——这就出现了看似“延迟为负”的荒谬结果。修正上面两点后,用timeReceived - timeSent计算出来的数值就会和Firefox开发者工具显示的网络耗时一致了。
内容的提问来源于stack exchange,提问作者Shidomaru NeveRage

