Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一个相当于;gettimeofday“;在.NET中_C# - Fatal编程技术网

C# 是否有一个相当于;gettimeofday“;在.NET中

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属性并将其转换为微秒,

我正在使用.NET,但我需要与一个基于unix的日志记录服务进行通信,该服务自unix时代以来需要几秒钟和几微秒。通过执行以下操作可以轻松检索秒数:

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;