为什么以下代码(在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都是平等的。
无论发生什么时区,我都希望两个时刻能够平等。我的期望是错的吗?
答案 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),但不是相同的相对时间(使用时区偏移)。