我尝试验证某些计算机是否已同步。为此,我在字符串中读取远程机器的hrSystemTime OID,将其转换为DateTime并将其与本地机器的时间进行比较。我每天凌晨1点50分这样做。在11月3日凌晨1点50分,差异显示小时差异,而diff2显示没有差异。如果我仅在当天凌晨1:00到凌晨2:00之间进行验证,则会弹出1小时差异。 (凌晨2点是夏令时将小时改为冬季的凌晨1点)。
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
答案 0 :(得分:2)
您应该只在两个系统上使用DateTime.UtcNow
并进行比较。这消除了影响比较的本地时区和DST问题。
在两个系统之间进行比较时,您可能还应该使用ISO8601格式的字符串,以防这些系统由于区域设置而具有不同的日期格式。您可以使用yourDateTime.ToString("o")
获得该作品。
但也要考虑,您可能没有考虑到比较中的网络传输延迟时间。为此,您应该使用NTP而不是在C#中编写自己的代码。
答案 1 :(得分:0)
当你说你每天凌晨1:50运行时,你是否读过dateTime.Now()。 看起来你的DateTime.Now正确地从DST更改为DST,导致不同的通用时间,但是在世界时,你可以通过它的外观在不同的时间运行作业。
如果您确保检索包含时区信息的本地和远程时间,它将包含一个支持DST的UTC偏移量,这样即使一方切换DST,它也不会影响您的比较。
请注意,管理作业调度的时钟应该知道DST更改。