为什么DateTime.Now.ToBinary()返回的值与构造函数创建时的值不同
本文关键字:创建 构造函数 DateTime ToBinary 返回 为什么 Now | 更新日期: 2023-09-27 18:35:07
这是我尝试过的:
DateTime now = DateTime.Now;
long timeA = now.ToBinary();
long timeB = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond).ToBinary();
Debug.WriteLine("{0} {1}", timeA, timeB);
这是输出:
-8588637543837682554 634734565017110000
timeA
和timeB
本质上应该是同一件事,但它们被转换为完全不同的(负)二进制文件。
为什么会这样?为什么直接调用ToBinary()
DateTime.Now
会产生不同的结果?
编辑:由于我的问题被误解(因此被否决),我已经更正了我的帖子,以更好地代表真正的问题。问题出在 DateTime.Kind 中,这才是真正的问题,而不是连续两次 DateTime.Now 调用中的微小差异。
你的两个值有不同的Kind
,并且该类型也被ToBinary
序列化。
DateTime.Now
有Kind == DateTimeKind.Local
,您使用new DateTime(...)
创建的日期时间具有Kind == DateTimeKind.Unspecified
。如果需要其他类型,则可以对new DateTime(...)
使用另一个重载。
它们DateTime
值不同,因此这是意料之中的。
若要处理相同的 DateTime
值,只需调用一次DateTime.Now
,然后重用它。
var now = DateTime.Now;
long timeA = now.ToBinary();
long timeB = new DateTime(now.Ticks, now.Kind).ToBinary();;
Console.WriteLine(timeA);
Console.WriteLine(timeB);
首先,您必须使用 DateTime.FromBinary()
再次(重新)创建相同的DateTime
对象。
但这也可能与由局部时差引起的oroginal物体不同。请查看这篇 MSDN 文章,其中详细解释了这一点。
好的,首先两个日期时间有不同的Kind
。 DateTime.Now
是"本地类型",第二个是"未指定类型"。
var now = DateTime.Now;
var timeA = now.ToBinary();
var dateB = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, now.Kind);
var timeB = dateB.ToBinary();
Console.WriteLine(timeA);
Console.WriteLine(timeB);
这会产生不同的结果:
-8588637530157241842
-8588637530157245808
然而,使用刻度给出正确的结果,这是因为刻度使用 100 纳秒间隔,这比毫秒更准确。
毫秒是可以指定的最小值,但不是最小的内部变量。
var dateB = new DateTime(now.Ticks, now.Kind);
在 DateTime 的两个调用之间。现在,毫秒过去了,这些使两个值不同