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

时间:2012-05-24 09:56:09

标签: c# .net datetime deserialization

这是我尝试过的:

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调用的小差异。

5 个答案:

答案 0 :(得分:9)

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

DateTime.NowKind == DateTimeKind.Local,您使用new DateTime(...)创建的日期时间为Kind == DateTimeKind.Unspecified。如果你想要一种不同的类型,你可以为new DateTime(...)使用另一个重载。

答案 1 :(得分:6)

它们的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);

答案 2 :(得分:2)

首先,您必须再次使用DateTime.FromBinary()来创建相同的DateTime对象。

但这也可能与当地时差引起的oroginal对象不同。请查看this MSDN详细说明这一点的文章。

答案 3 :(得分:2)

好的,首先两个DateTimes有不同的KindDateTime.Now属于Kind Local,第二种是Kind Unspecified。

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

答案 4 :(得分:0)

在DateTime.Now的两次调用之间,毫秒传递,这些使两个值不同