1

TimeSpan 类可以用天、小时、分钟、秒和毫秒来构造:

public TimeSpan(int hours, int minutes, int seconds);
public TimeSpan(int days, int hours, int minutes, int seconds);
public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds);

它也可以用 100 纳秒时间单位的“滴答”构建:

public TimeSpan(long ticks);

当许多其他与时间相关的对象(例如 System.Timers.Timer.Interval)都基于毫秒单位时,100 纳秒有什么意义?另外,为什么不使用微秒,它长 10 倍,但更常见的时间单位?

4

3 回答 3

3

因为 Wintel 计算机基于使用 100ns 滴答的硬件时钟。

于 2012-06-29T20:44:57.963 回答
2

它是一个clunk,是 [Open]VMS 中使用的时间单位。

于 2012-06-29T21:06:51.457 回答
2

除非您自己参与决策,否则很难回答“为什么”的问题。话虽如此,正如 HABO 的回答所表明的那样,100 ns 滴答声很可能是 VMS 的灵感(Dave Cutler参与了 VMS 和 Windows NT 的设计)。

但是,由于您希望将时间跨度适合有符号的 64 位数字,因此使用 100 ns 作为刻度值是有意义的。最大时间跨度 ( TimeSpan.MaxValue) 为

0x7FFF FFFF FFFF FFFF 滴答声
  = 9 223 372 036 854 775 807 个滴答声
  = 9 223 372 036 854 775 807 滴答 / 10 000 000 滴答/秒
  = 922 337 203 685 秒
  ~ 30 000 年

不同的刻度值导致不同的最大时间跨度:

蜱虫 | 最大时间跨度(大约)
-------+------------
 10 纳秒 | 3000 年
100 纳秒 | 30 000 年
  1微秒| 30万年

忽略DateTime.Kind一个DateTime值基本上是TimeSpan与纪元 01-01-0001 00:00:00 ( DateTime.MinValue) 的偏移量,因此使用 100 ns 滴答声,您可以适应日期 31-12-9999 23:59:59 ( DateTime.MaxValue)。对于 10 ns 滴答声,您将在 3000 年之前用完滴答声,这是不可能的。而对于 1 μs 滴答声,您可以将时间分辨率降低 10 倍,而对于假设 10000 年的日期表示,您不会得到任何回报第一年“你不在乎”。

考虑到这一点,似乎使用带符号的 64 位值仍然允许您表示所有 4 位数年份的最小刻度值是 100 ns。

(如果你认为 2000 年的问题对 IT 行业来说很难,那就等 10000 年的问题吧。)

于 2016-11-17T12:29:57.150 回答