这是我尝试过的:
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调用的小差异。
答案 0 :(得分:9)
您的两个值具有不同的Kind
,并且该类型也被ToBinary
序列化。
DateTime.Now
已Kind == 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有不同的Kind
。
DateTime.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的两次调用之间,毫秒传递,这些使两个值不同