我正在使用.NET,但我需要与基于unix的日志服务进行通信,这需要自Unix纪元时间以来的秒和微秒。秒可以轻松检索,例如:
DateTime UnixEpoch = new DateTime(1970, 1, 1);
TimeSpan time = DateTime.UtcNow() - UnixEpoch
int seconds = (int) time.TotalSeconds
然而,我不确定如何计算微秒。我可以使用TotalMilliseconds属性并将其转换为微秒,但我认为这使得使用微秒作为精确测量的目的失败了。我已经研究过使用StopWatch类,但似乎我不能用它来播种它(例如Unix Epoch)。
感谢。
答案 0 :(得分:12)
使用Ticks
属性获取最细粒度的详细信息。刻度是100ns,因此除以10得到微秒。
然而,这谈到了表示精度 - 它根本没有谈论准确性。鉴于DateTime.UtcNow
的粗粒度,我不希望它特别有用。有关详细信息,请参阅Eric Lippert的blog post about the difference between precision and accuracy。
您可能想要在已知时间启动秒表,并且基本上将其时间添加到“起始点”。请注意,Stopwatch
中的“滴答”与TimeSpan.Ticks
并不相同。
答案 1 :(得分:5)
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毫秒左右。