DateTime.Ticks,DateTime.Equals和timezones

为什么以下代码(在C#中)返回false:

DateTime d = DateTime.Now; d.Ticks == d.ToUniversalTime().Ticks; // false 

我希望DateTime的滴答基于UTC时间。 DateTime.Ticks上的MSDN页面提到了

此属性的值表示自0001年1月1日午夜12:00:00起经过的100纳秒间隔的数量,表示DateTime.MinValue。 它不包括可归因于闰秒的刻度数。

1月1日午夜,0001 ..在哪个时区?

为什么DateTime.Ticks会依赖于时区?

我猜Ticks不同的事实是下面的代码也返回false的原因

 DateTime d = DateTime.Now; d == d.ToUniversalTime(); // false 

DateTime.Equals上的MSDN文档提到

如果Ticks属性值相等,则t1和t2相等。 他们的Kind属性值不在平等测试中考虑。

我的期望是,无论时区如何,DateTime.Ticks都是平等的。

无论发生在什么时区,我都希望有两个时刻能够平等。 我的期望错了吗?

来源: http : //social.msdn.microsoft.com/Forums/en/netfxbcl/thread/fde7e5b0-e2b9-4d3b-8a63-c2ae75e316d8

DateTime.Ticks记录为“自0001年1月1日午夜12:00:00起经过的100纳秒间隔的数量”。 那是当地时间1月1日至1月1日。 如果您将DateTime转换为UTC,那么Ticks将是自0001 UTC 1月1日午夜12:00:00起经过的100纳秒间隔的数量。 与当地时间1月1日当地时间有所不同,两个Ticks值将有所不同。

您当前的日期时间(除非您居住在一个特定时区 – GMT)从UTC时间偏移x小时,因此DateTime.Now可能会让您在凌晨4点,而Datetime.Now.ToUniversalTime()可能在晚上11点在您当前的时区。

Ticks是从您的时区转换为通用时间之后计算出来的,所以它们唯一相同的时间就是您居住在GMT时区。

更简单地说,2011年1月1日上午8:00之间的刻度数与2011年1月1日11:00 PM之后的刻度数不同。 在你的代码中,日期被转换为通用日期,然后在方程的右侧进行计算,但它只是使用你的本地日期来获得左边的差异,因此,它们是!=每个其他。

DateTime.Now是根据您的时区偏移确定的,这意味着它将与通用时间不同,除非您的偏移量为零。 将DateTime.Now转换为两个不同时区的刻度并获得相同的结果是没有意义的 – 它们是相同的绝对时间(UTC),但不是相同的相对时间(使用时区偏移)。