据我所知,DateTime
和TimeSpan
结构的二进制表示是8字节的刻度数(根据TimeSpan.TicksPerSecond
,1毫秒= 10000刻度)。天,小时,分钟等属性的值是通过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)?
答案 0 :(得分:3)
如果您在这里查看源代码(不确定这是哪个版本,但您明白了):
你可以看到根据时间是否为本地来应用高位。
从快速浏览代码开始,有一个名为:
的const成员private const UInt64 KindLocal = 0x8000000000000000;
看起来好像是在转换中使用的。我怀疑这种情况正在发生,因为你正在使用DateTime.Now,这是一个本地'现在'。如果您使用'UtcNow',它可能会设置不同的位。
private const UInt64 KindUtc = 0x4000000000000000;
然而,当你把它作为'ticks'时,它可能会返回未指定的形式,它没有设置顶部位。
private const UInt64 KindUnspecified = 0x0000000000000000;
基本上,你会对结构的内部工作感到困惑。如果你真的想了解它,那么我建议挖掘代码。否则,只需按照说明使用它,它就可以正常使用了!