在.NET中是否有相当于“gettimeofday”的东西

时间:2011-01-31 22:02:11

标签: c#

我正在使用.NET,但我需要与基于unix的日志服务进行通信,这需要自Unix纪元时间以来的秒和微秒。秒可以轻松检索,例如:

DateTime UnixEpoch = new DateTime(1970, 1, 1);
TimeSpan time = DateTime.UtcNow() - UnixEpoch
int seconds = (int) time.TotalSeconds

然而,我不确定如何计算微秒。我可以使用TotalMilliseconds属性并将其转换为微秒,但我认为这使得使用微秒作为精确测量的目的失败了。我已经研究过使用StopWatch类,但似乎我不能用它来播种它(例如Unix Epoch)。

感谢。

4 个答案:

答案 0 :(得分:12)

使用Ticks属性获取最细粒度的详细信息。刻度是100ns,因此除以10得到微秒。

然而,这谈到了表示精度 - 它根本没有谈论准确性。鉴于DateTime.UtcNow的粗粒度,我不希望它特别有用。有关详细信息,请参阅Eric Lippert的blog post about the difference between precision and accuracy

您可能想要在已知时间启动秒表,并且基本上将时间添加到“起始点”。请注意,Stopwatch中的“滴答”与TimeSpan.Ticks并不相同。

答案 1 :(得分:5)

来自Epoch Converter

epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;

由于整数除法,这将截断它,因此使10000000.0保持亚秒部分,或者只是不进行除法。

重要的是要注意,你得到的.Ticks属性是相对于1970年1月1日和 1970年1月1日,就像在UNIX中那样你需要减去上面的偏移量

编辑:为了清楚起见,这个令人讨厌的常数只是UTC的1月1日和1970年1月1日之间的刻度数。如果你拿它的秒部分(62135596800)并除以(365 * 24 * 60 * 60)你会看到你得到一个接近1970的数字,当然这不是1970年飞跃调整。

答案 2 :(得分:1)

DateTime.Ticks表示自0001年1月1日以来100纳秒的单位。

答案 3 :(得分:0)

在具有动态变化的时钟速率的现代CPU上,获得精确的亚毫秒时序非常困难(或昂贵)。

我建议您将Milliseconds属性乘以1000。

像Jon建议的那样使用Ticks,但我认为你的准确度仍然在1毫秒左右。