为什么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

timeAtimeB本质上应该是同一件事,但它们被转换为完全不同的(负)二进制文件。

为什么会这样?为什么直接调用ToBinary() DateTime.Now会产生不同的结果?

编辑:由于我的问题被误解(因此被否决),我已经更正了我的帖子,以更好地代表真正的问题。问题出在 DateTime.Kind 中,这才是真正的问题,而不是连续两次 DateTime.Now 调用中的微小差异。

为什么DateTime.Now.ToBinary()返回的值与构造函数创建时的值不同

你的两个值有不同的Kind,并且该类型也被ToBinary序列化。

DateTime.NowKind == 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 文章,其中详细解释了这一点。

好的,首先两个日期时间有不同的KindDateTime.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 的两个调用之间。现在,毫秒过去了,这些使两个值不同