0

我尝试验证某些机器是否已同步。为此,我在字符串中读取远程机器的 hrSystemTime OID,将其转换为 DateTime 并将其与本地机器的时间进行比较。我每天凌晨 1:50 执行一次。11 月 3 日凌晨 1:50,diff 显示一个小时的差异,而 diff2 显示没有差异。如果我仅在这一天凌晨 1:00 到凌晨 2:00 之间进行验证,则会弹出这个 1 小时的差异。(2:00 AM 是 DST 将冬季时间更改为 1:00 AM 的时间)。

DateTime localTime;
DateTime remoteTime;
TimeSpan diff, diff2;
localTime = DateTime.Now;
remoteTime = Convert.ToDateTime("11/03/2013 1:50:00 AM");
diff = localTime.ToUniversalTime() - remoteTime.ToUniversalTime();
diff2 = localTime.ToLongTimeString() - remoteTime.ToLongTimeString();

这些是打印的值:

localTime.ToUniversalTime() = 11/03/2013 1:50:00 AM
remoteTime.ToUniversalTime() = 11/03/2013 1:50:00 AM
localTime.ToLongTimeString() = 11/02/2013 8:50:00 PM
remoteTime.ToLongTimeString() = 11/02/2013 9:50:00 PM
4

2 回答 2

2

您可能应该只DateTime.UtcNow在两个系统上使用并比较它们。这消除了影响比较的本地时区和 DST 问题。

在两个系统之间进行比较时,您可能还应该使用 ISO8601 格式的字符串,以防这些系统由于区域设置而具有不同的日期格式。你可以用yourDateTime.ToString("o").

但也要考虑一下,您可能没有在比较中考虑网络传输延迟时间。为此,您应该使用 NTP 而不是用 C# 编写自己的代码。

于 2013-11-06T15:40:37.197 回答
0

当您说您每天凌晨 1:50 运行此程序时,您是否阅读 dateTime.Now()。看起来您的 DateTime.Now 已正确更改为 DST 或更改为 DST,从而导致不同的通用时间,但您在通用时间中运行作业的时间不同。

如果您确保检索包括时区信息在内的本地和远程时间,它将包括一个可识别 DST 的 UTC 偏移量,这样即使一侧切换 DST 也不会影响您的比较。

请注意,管理您的作业调度的时钟应该知道 DST 更改。

于 2013-11-06T15:58:02.860 回答