据我所知,DateTime
和TimeSpan
结构的二进制表示是 8 字节的刻度数(根据 1 毫秒 = 10000 个刻度TimeSpan.TicksPerSecond
)。并且天、小时、分钟等属性的值是通过对 、 等常量的整数TicksPerDay
除法TicksPerHour
获得TicksPerSecond
的TimeSpan
。
例如,如果您运行此代码:
TimeSpan s1 = new TimeSpan(3, 5, 7, 9, 11).AddTicks(13));
long t1 = s1.Ticks;
您可以在内存窗口中获得(如果您使用 Visual Studio)类似的内容:
0x061BE4D0 3d 2a c9 67 86 02 00 00
0x061BE4E0 3d 2a c9 67 86 02 00 00
其中0x061BE4D0
和分别是和0x061BE4E0
的地址。(实际上你应该在内存窗口的地址区域写' '和' '而不是' ')s1
t1
s1
&t1
t1
现在,如果您运行另一段代码:
DateTime d1 = new DateTime(1, 1, 3, 5, 7, 9, 11).AddTicks(13);
long t1 = d1.Ticks;
DateTime d2 = DateTime.Now;
long t2 = d2.Ticks;
您将分别看到 ' d1
'、' &t1
'、' d2
'、' &t2
' 的数据,如下所示:
0x061AE438 3d 6a 5f 3d bd 01 00 00
0x061AE430 3d 6a 5f 3d bd 01 00 00
0x061AE424 bd 71 d5 02 3f 9d d0 88
0x061AE41C bd 71 d5 02 3f 9d d0 08
为什么DateTime.Now
在其二进制表示中设置最高位(0x 80 00 00 00 00 00 00 00)?