1

据我所知,DateTimeTimeSpan结构的二进制表示是 8 字节的刻度数(根据 1 毫秒 = 10000 个刻度TimeSpan.TicksPerSecond)。并且天、小时、分钟等属性的值是通过对 、 等常量的整数TicksPerDay除法TicksPerHour获得TicksPerSecondTimeSpan

例如,如果您运行此代码:

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的地址。(实际上你应该在内存窗口的地址区域写' '和' '而不是' ')s1t1s1&t1t1

现在,如果您运行另一段代码:

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)?

4

1 回答 1

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; 

但是,当您将其作为“记号”获取时,它可能会返回未指定的形式,该形式没有设置最高位。

private const UInt64 KindUnspecified       = 0x0000000000000000; 

基本上,您会被结构的内部工作方式所困扰。如果您真的想了解它,那么我建议您深入研究代码。否则,只需按照说明使用它,它就会对您有用!

于 2013-10-22T05:47:44.667 回答