5

这是我尝试过的:

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

timeAand本质上timeB应该是相同的东西,但是它们被转换为完全不同的(负)二进制文件。

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

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

4

5 回答 5

11

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

DateTime.Nowhas Kind == DateTimeKind.Local,您创建的 DateTime 有new DateTime(...)has Kind == DateTimeKind.Unspecifiednew DateTime(...)如果你想要不同的类型,你可以使用另一个重载。

于 2012-05-24T09:59:49.933 回答
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);
于 2012-05-24T09:58:11.520 回答
3

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

但这也可能与由当地时差引起的原始物体不同。请查看这篇 MSDN文章,其中详细解释了这一点。

于 2012-05-24T10:02:57.877 回答
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);
于 2012-05-24T10:06:15.377 回答
0

在 DateTime.Now 的两个调用之间,经过了毫秒,这使得两个值不同

于 2012-05-24T09:59:39.607 回答