对于我的应用程序,我必须跟踪时间变化,以“平滑”时间变化。
系统时间更改可能有几个原因:
- 用户更改其系统时间
- OS NTP 服务器更新本地时间
- ...
所以实际上我们有一个“TimeProvider”,它为整个应用程序提供当前时间。
目标是检测是否发生时移并平滑地校正我们的本地时间(例如,如果我们有一个一小时的“时间跳跃”,则每秒校正 100 毫秒,直到完全校正为止)。
这基本上是我必须提供的时间(请注意,目前我绝对不会平滑时间变化,但不是我当前的问题)
internal class TimeChange : IDisposable
{
private readonly Timer _timer;
private readonly Stopwatch _watch = new Stopwatch();
private DateTime _currentTime;
public DateTime CurrentTime
{
get { return _currentTime + _watch.Elapsed; }
}
public TimeChange()
{
_timer = new Timer(1000);
_timer.Elapsed += OnTimerElapsed;
_timer.Start();
_watch.Start();
_currentTime = DateTime.UtcNow;
}
public void Dispose()
{
_timer.Stop();
_timer.Elapsed -= OnTimerElapsed;
}
private void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
DateTime currentTime = DateTime.UtcNow;
TimeSpan timeDerivation = currentTime - _currentTime - _watch.Elapsed;
_watch.Restart();
_currentTime = currentTime;
Console.WriteLine("Derivation: " + timeDerivation.TotalMilliseconds + "ms");
}
}
但是在进行一些测试时,我注意到即使在本地时间没有做任何事情,我也有差异。差别不大(<1ms),但仍然:
Press enter to stop
Derivation: -0.1367ms
Derivation: 0.9423ms
Derivation: 0.0437ms
Derivation: 0.0617ms
Derivation: 0.0095ms
Derivation: 0.0646ms
Derivation: -0.0149ms
这是 1 秒的推导,如果我只是将 1000 毫秒替换为 10000 毫秒,我很快就会得到 1 毫秒到 0.5 毫秒之间的时间推导。
所以我的问题(最后:P):
- 为什么两者之间
Utc.DateTime
给了我这么大的差异?它们都是基于时钟滴答不? - 没有办法更精确地获得这个时间转换吗?