From 8aec6aec1b402d69f9c914bc6195ff0b54b394fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Fri, 6 Mar 2026 09:57:12 +0800 Subject: [PATCH] Use RTT midpoint to adjust Date.now Measure local time before and after fetching server time and compute offset using the midpoint (compensates for network latency). Round the calculated offset and lower the adjustment threshold from 5000ms to 500ms to avoid applying small corrections. Also rename timing variables for clarity. --- packages/napcat-core/helper/server-time.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/napcat-core/helper/server-time.ts b/packages/napcat-core/helper/server-time.ts index 97e43f41..ce042bb6 100644 --- a/packages/napcat-core/helper/server-time.ts +++ b/packages/napcat-core/helper/server-time.ts @@ -14,15 +14,17 @@ export const OriginalDateNow: () => number = Date.now.bind(Date); * @returns 偏移量(毫秒) */ export function hookGlobalDateNow (getServerTimeFn: () => string): number { - const localNow = OriginalDateNow(); + const start = OriginalDateNow(); const serverTimeStr = getServerTimeFn(); + const end = OriginalDateNow(); const serverTimeMs = parseInt(serverTimeStr, 10); if (isNaN(serverTimeMs) || serverTimeMs <= 0) { return 0; } - const offsetMs = serverTimeMs - localNow; + // 补偿网络延迟:假定往返时间对称,服务器时间对应本地时间的中点 (start + end) / 2 + const offsetMs = Math.round(serverTimeMs - (start + end) / 2); if (Math.abs(offsetMs) > 5000) { Date.now = () => OriginalDateNow() + offsetMs;