C# 如何记录计算机之间的相对时间?

C# 如何记录计算机之间的相对时间?,c#,time,computer-science,C#,Time,Computer Science,我需要在不同的计算机上独立记录事件,并重建这些事件相对于彼此发生的顺序。解决方案要求每台计算机相对独立;他们不能直接相互交谈,也不能通过单一渠道交谈 我最初的解决方案记录了每台机器上的时间,但由于时间在不同的机器上可能不同,并且一天中可能会发生变化,这并没有完全解决我的问题。我决定在机器(1)启动进程或(2)系统时钟发生变化时与所有机器共享 所以从每台机器上我都能得到一个完整的日志 public class Activity { DateTime TimeOccurred { get;

我需要在不同的计算机上独立记录事件,并重建这些事件相对于彼此发生的顺序。解决方案要求每台计算机相对独立;他们不能直接相互交谈,也不能通过单一渠道交谈

我最初的解决方案记录了每台机器上的时间,但由于时间在不同的机器上可能不同,并且一天中可能会发生变化,这并没有完全解决我的问题。我决定在机器(1)启动进程或(2)系统时钟发生变化时与所有机器共享

所以从每台机器上我都能得到一个完整的日志

public class Activity {
    DateTime TimeOccurred { get; set; }
    string Description { get; set; }
}
每当上述(1)或(2)发生时,我将向日志中添加一个活动,并将其广播给其他机器,这些机器将相同的活动添加到其日志中,TranslatedTime为其自己的时间:

public class TimeSynchronization : Activity {
    string SourceMachine { get; set; }
    DateTime TranslatedTime { get; set; }
}
因此,机器A将(按顺序):

机器B将(按顺序):

因此,我需要重建上述事件的相同顺序和时间,类似于:

On machine A: TimeSynchronization "started" at 0:00
On machine A: Activity "asked a question" at 0:05
On machine B: TimeSynchronization "started" at 0:05
On machine A: TimeSychronization from machine B at 0:05
On machine A: TimeSynchronization "clock changed" at 0:06
On machine B: TimeSynchronization "clock changed" at 0:06
On machine A: Activity "received an answer" at 0:07

从每台机器中提取一个
列表
,并将其按顺序合并到一个列表中的最佳方法是什么?

看起来他们希望您对其进行直觉操作

此外,请查看:

NTP是一种旨在 使计算机时钟同步 通过网络


如果两台机器通过网络连接,您的程序可以询问另一台机器现在几点了。这样,计算机A上的程序就可以在A和B上询问时间,然后记录这两次


您提到时间在一天中可能会改变(可能是用户改变了时间)。您可以通过使用Win32.TimeChanged事件。

原子时以及提供该事件的Web服务来检测此情况。这就是你需要的。现实的?不知道。但至少你不必担心n台计算机试图同步它们的时钟。

首先:如果每台计算机上的操作都是真正并行的,你就不能保证有一个规范的序列化顺序。如果在整个过程中有一些协调,那么最好在协议中使用某种排序,这样您就可以根据它进行排序


除此之外,您还需要计算机器之间的时钟偏差以调整时间。这样做的方式相当简单:询问另一台机器的当前时间,并测量该请求的往返时间。假设远程机器报告的时间是往返时间的一半(这假设平均对称延迟-不一定是真的,但如果不深入研究网络布局,就无法做得更好),然后从当前机器的时间中减去它。那是你的钟歪了。您可能需要多次测量倾斜并取平均值,以平衡连接上的间歇性延迟。

我认为您需要以UTC(世界时)记录所有内容。这将允许记录时间及其相对于公共时间点的时间,并使得比较日期/时间非常容易。要在本地时间显示它们,只需确定偏移量并计算UTC时间与本地时间的差值。e、 g.东海岸的UTC-5,所以如果UTC时间是17:00,纽约当地时间是12:00,达拉斯的UTC-6,所以是上午11:00

因此,如果达拉斯上午11:10有一个事件,其UTC时间是17:10,而纽约下午12:05有一个事件是17:05 UTC,那么你知道纽约事件首先发生,但如果你对时间进行原始比较,这似乎不是这样


UTC还有一个优势,即它始终代表一天中的所有24小时,因此,在秋季,当您取消日间灯节约时间时,您不会获得2组凌晨2点到凌晨3点的活动,并且当您跳出来使用dalylight节约时间时,您不会损失数小时

如果您需要在计算机之间进行非常精确的时钟同步,请使用GPS。

难道您不能让所有服务器将它们的时钟与公共源同步吗?或者,通过让每台机器将其日志写入单个数据库并使用数据库时钟来同步事件?你的解决方案似乎太复杂了。是的,是吗?我所处的环境无法添加现有的基础设施。这是我的解决方案中的一个约束,而不是我想要的方式。为什么要修改系统时钟时间一次只改变一秒钟。都是相对的!+karims的回答应该会引导你找到一个好的方向是的,上面的问题陈述包括时间变化和机器之间的对话。我正在努力解决“以正确的顺序将所有内容合并在一起”的问题。从A或B计算机中选择一台,并始终记录该计算机的时间。如果计算机永远不会返回时间,这一点就行了。请参见上面的示例。“收到答案”活动需要在“询问问题”之后,即使在其自己的机器上,它在标记的时间之前。
TimeSynchronization "started" at 3:05 am.
TimeSynchronization "clock changed" at 3:06
On machine A: TimeSynchronization "started" at 0:00
On machine A: Activity "asked a question" at 0:05
On machine B: TimeSynchronization "started" at 0:05
On machine A: TimeSychronization from machine B at 0:05
On machine A: TimeSynchronization "clock changed" at 0:06
On machine B: TimeSynchronization "clock changed" at 0:06
On machine A: Activity "received an answer" at 0:07