C# 是否有一个相当于;gettimeofday“;在.NET中
我正在使用.NET,但我需要与一个基于unix的日志记录服务进行通信,该服务自unix时代以来需要几秒钟和几微秒。通过执行以下操作可以轻松检索秒数:C# 是否有一个相当于;gettimeofday“;在.NET中,c#,C#,我正在使用.NET,但我需要与一个基于unix的日志记录服务进行通信,该服务自unix时代以来需要几秒钟和几微秒。通过执行以下操作可以轻松检索秒数: DateTime UnixEpoch = new DateTime(1970, 1, 1); TimeSpan time = DateTime.UtcNow() - UnixEpoch int seconds = (int) time.TotalSeconds 然而,我不确定如何计算微秒。我可以使用totalmillizes属性并将其转换为微秒,
DateTime UnixEpoch = new DateTime(1970, 1, 1);
TimeSpan time = DateTime.UtcNow() - UnixEpoch
int seconds = (int) time.TotalSeconds
然而,我不确定如何计算微秒。我可以使用totalmillizes属性并将其转换为微秒,但我认为这违背了使用微秒作为精确测量的目的。我曾研究过使用StopWatch类,但它似乎不能为它设定时间(例如Unix Epoch)
谢谢。使用该属性可以获得最细粒度的详细信息。一个刻度是100纳秒,所以除以10可以得到微秒
然而,这涉及到表示精度——根本不涉及精度。考虑到DateTime.UtcNow
的粗粒度,我不认为它特别有用。有关更多信息,请参见埃里克·利珀特
您可能希望在已知时间启动秒表,并基本上将其时间添加到“起点”。请注意,秒表中的“滴答声”与时间跨度中的“滴答声”并不相同。滴答声来自:
这将因为整数除法而截断它,因此将其设置为10000000.0
,以保持亚秒部分,或者干脆不进行除法
需要注意的是,您获得的.Ticks
属性与0001年1月1日相关,而不是与UNIX中的1970年1月1日相关,这就是您需要减去上述偏移量的原因
编辑:为了清楚起见,这个讨厌的常数只是UTC 0001年1月1日到1970年1月1日之间的刻度数。如果你把它的秒数部分(62135596800
)除以(365*24*60*60),你会发现你得到一个接近1970
,这当然不完全是1970,因为闰调整。表示自0001年1月1日以来100纳秒的单位。在时钟频率动态变化的现代CPU上,获得精确的亚毫秒计时非常困难(或昂贵)
我建议您将毫秒
属性乘以1000
像Jon建议的那样使用滴答声
,但我认为你的准确度仍将在1ms左右。这将是我的答案,但我不知道滴答声的分辨率。这样做。除了,既然100ns=.1us,你不应该用滴答数除以10得到微秒吗?这是最好的答案,因为它提供了UtcNow()
中可用的最高精度,但我认为ticks
属性真的不那么精确。@Keith:哇,是的,修正:)谢谢,我将对此进行研究。@pst:很容易混淆这三个:绝对精度(即与维持时间标准的原子钟的一致性)、相对精度(即测量精度)(此处正在讨论)和表示精度(即有效数字)(Eric称之为精度)。在科学界,当单独使用“精度”一词时,它通常意味着测量精度,这与可重复性密切相关,与Eric使用该术语的含义相反。(同样,在科学界,准确性处理偏见)。
epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;