DateTime.Ticks,DateTime.Equals和timezones

时间:2012-04-20 18:49:56

标签: c# datetime date

为什么以下代码(在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都是平等的。

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

3 个答案:

答案 0 :(得分:11)

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

  

DateTime.Ticks记录为“100纳秒间隔的数量   自0001年1月1日午夜12:00:00起已经过去了。那就是   当地时间1月1日至1月1日。如果您将DateTime转换为UTC,则Ticks   然后将是已经过去的100纳秒间隔的数量   自UTC时间1月1日午夜12:00:00起可能有所不同   当地时间1月1日 - 1月,两个Ticks值将是   不同。

答案 1 :(得分:1)

您当前的日期时间(除非您居住在某个特定时区 - 格林威治标准时间)与UTC时间相差x小时,因此DateTime.Now可能会将您放在凌晨4点,而Datetime.Now.ToUniversalTime()可能位于晚上11点,取决于您当前的时区。

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

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

答案 2 :(得分:0)

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