可以使用天,小时,分钟,秒和毫秒构建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倍长,但更常见的时间单位?
答案 0 :(得分:3)
因为Wintel计算机基于使用100ns滴答的硬件时钟。
答案 1 :(得分:2)
这是clunk,是[Open] VMS中使用的时间单位。
答案 2 :(得分:2)
除非您自己参与决策,否则回答“为什么”问题并不容易。据说HABO的回答(Dave Cutler参与了VMS和Windows NT的设计),这可以说是100 ns,很可能是来自VMS的灵感。
但是,由于您希望将时间跨度拟合为有符号的64位数字,因此使用100 ns作为刻度值是有意义的。最大的时间跨度(TimeSpan.MaxValue
)是
0x7FFF FFFF FFFF FFFF ticks = 9 223 372 036 854 775 807 ticks = 9 223 372 036 854 775 807 ticks / 10 000 000 ticks/s = 922 337 203 685 s ~ 30 000 years
不同的刻度值会导致不同的最大时间跨度:
Ticks | Max time span (approx.) -------+------------------------ 10 ns | 3 000 years 100 ns | 30 000 years 1 μs | 300 000 years
忽略DateTime.Kind
DateTime
值基本上距离纪元01-01-0001 00:00:00(TimeSpan
)的DateTime.MinValue
偏移量,因此100 ns刻度你可以容纳31-12-9999 23:59:59(DateTime.MaxValue
)的日期。如果您在3000年之前用完蜱,那么这将是不可能的。在1年的时间内,您可以将时间分辨率降低10倍而不会得到任何关于日期表示的任何回报,假设10000年是第一年“你不在乎”。
考虑到这一点,似乎使用带符号的64位值,仍然允许您表示所有4位数年份的最小刻度值为100 ns。
(如果你认为2000年的问题对IT行业来说很难,只需要等待10000年的问题。)