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

C#中不依赖本地DateTime,如何高效获取可靠服务器时间?

解决客户端时间不可靠,高效获取服务器时间的方案

我之前做项目的时候也踩过客户端时间的坑——用户改本地时间简直防不胜防,给你几个实用的思路:

1. 用高精度计时器+定期同步,绕开本地DateTime依赖

核心思路是:不要用本地时间算差值,用系统自带的单调计时器(不受本地时间修改影响)来跟踪时间流逝。具体步骤:

  • 第一次调用GetDateTimeOnline()拿到服务器时间,同时启动一个高精度计时器(比如C#里的Stopwatch)
  • 之后每次需要服务器时间时,就用「上次同步的服务器时间 + 计时器流逝的时间」来计算,就算用户改了本地DateTime,计时器的流逝时长是完全准确的
  • 定期(比如每1-2小时)重新调用GetDateTimeOnline()校准一次,避免计时器长时间运行的微小漂移

给你个代码示例参考:

// 存储上次同步的服务器时间
private DateTime _lastSyncedServerTime;
// 跟踪上次同步后流逝的时间(不受本地时间修改影响)
private Stopwatch _timeElapsedSinceSync;

// 初始化/手动同步服务器时间
public void SyncWithServerTime()
{
    _lastSyncedServerTime = GetDateTimeOnline();
    _timeElapsedSinceSync = Stopwatch.StartNew();
}

// 获取当前的服务器时间
public DateTime GetCurrentServerTime()
{
    return _lastSyncedServerTime + _timeElapsedSinceSync.Elapsed;
}

// 后台定期校准,比如用定时器每小时执行一次
public void SchedulePeriodicSync()
{
    // 这里可以用Timer或者HostedService实现定时任务
    SyncWithServerTime();
}

2. 关键节点才实时调用GetDateTimeOnline()

如果你的程序不是每时每刻都需要服务器时间,只在时间敏感的关键操作时调用接口:

  • 比如用户提交订单、发起支付时,实时获取服务器时间作为操作时间
  • 做权限验证、有效期检查这类逻辑时,直接调用接口拿最新服务器时间

这种方式简单直接,不会有时间漂移的问题,也不会频繁请求服务器。

3. 绝对要避开的坑

千万别尝试用DateTime.Now和服务器时间算差值,再用DateTime.Now + 差值来推算服务器时间——用户随便改一下本地时间,这个差值就完全失效了,直接导致推算出的时间完全错误。

内容的提问来源于stack exchange,提问作者Abrahem haj hle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:26:24