为什么 DateTime.Now 在 DateTime 通常的二进制表示形式中设置最高位
本文关键字:DateTime 高位 表示 设置 二进制 Now 为什么 | 更新日期: 2023-09-27 18:36:30
据我所知,DateTime
和TimeSpan
结构的二进制表示是 8 字节的刻度数(根据 TimeSpan.TicksPerSecond
,1 毫秒 = 10000 个刻度)。天、小时、分钟等属性的值是通过对TimeSpan
TicksPerDay
、TicksPerHour
、TicksPerSecond
等常数进行整数除法得到
例如,如果您运行此代码:
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
如果你在这里查看源代码(不确定这是哪个版本,但你明白了):
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;
基本上,你被挂在结构的内部工作原理上。如果你真的想理解它,那么我建议你深入研究代码。否则,只需按照说明使用它,它就会适合您!