为什么DateTime.Now设置DateTime通常的二进制表示中的最高位?

时间:2013-10-22 05:25:32

标签: c# .net datetime

据我所知,DateTimeTimeSpan结构的二进制表示是8字节的刻度数(根据TimeSpan.TicksPerSecond,1毫秒= 10000刻度)。天,小时,分钟等属性的值是通过TicksPerDayTicksPerHourTicksPerSecond等常量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

其中0x061BE4D00x061BE4E0分别是s1t1的地址。 (实际上你应该在内存窗口的地址区域中写'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)?

1 个答案:

答案 0 :(得分:3)

如果您在这里查看源代码(不确定这是哪个版本,但您明白了):

http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/clr/src/BCL/System/DateTime@cs/1/DateTime@cs

你可以看到根据时间是否为本地来应用高位。

从快速浏览代码开始,有一个名为:

的const成员
private const UInt64 KindLocal             = 0x8000000000000000; 

看起来好像是在转换中使用的。我怀疑这种情况正在发生,因为你正在使用DateTime.Now,这是一个本地'现在'。如果您使用'UtcNow',它可能会设置不同的位。

private const UInt64 KindUtc             = 0x4000000000000000; 

然而,当你把它作为'ticks'时,它可能会返回未指定的形式,它没有设置顶部位。

private const UInt64 KindUnspecified       = 0x0000000000000000; 

基本上,你会对结构的内部工作感到困惑。如果你真的想了解它,那么我建议挖掘代码。否则,只需按照说明使用它,它就可以正常使用了!