日期时间.Ticks,日期时间.Equals和时区

12

为什么以下代码(使用C#)会返回false:

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

我希望一个DateTime的刻度基于UTC时间。

微软官方文档DateTime.Ticks中提到:

该属性的值表示自公元1年1月1日午夜12:00:00以来经过的100纳秒间隔数,即DateTime.MinValue。其中不包括由于闰秒引起的滴答声。

在哪个时区的0001年1月1日午夜?为什么DateTime.Ticks会取决于时区?我猜这些差异是下面代码返回false的原因。

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

DateTime.Equals 的 MSDN 文档中提到:

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

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

我期望两个时刻无论发生在哪个时区,都应该是相等的。但我的期望是错误的吗?


1
请注意,您可以使用DateTimeOffset(http://msdn.microsoft.com/en-us/library/system.datetimeoffset.op_equality.aspx),它在比较两个实例时比较时间点。 - Chris Shaffer
@ChrisShaffer 谢谢,我认为这是我应该使用的,因为我要找的是确切的时间点,而不是实际的“日期”。 - GuiSim
3个回答

13

2

除非你住在GMT时区,否则你当前的日期时间(Datetime.Now)与UTC时间相差x小时,因此Datetime.Now.ToUniversalTime()可能是晚上11点,而Datetime.Now可能是早上4点,具体取决于你当前所在的时区。

Tick数是在从你的时区转换为世界标准时间后计算出来的,因此只有当你住在GMT时区时,它们才应该相等。

简单地说,自2011年1月1日上午8:00以来的Tick数与自2011年1月1日晚上11:00以来的Tick数不同。在你的代码中,日期被转换为世界标准日期,然后右侧计算Tick数,但左侧只是使用你的本地日期获取差异,因此它们不相等。


我认为它们应该是相等的,因为它们代表了同一时刻。我没有预料到参考系的改变会改变它们的相等性。 - GuiSim
2
@GuiSim - 我的回答中第一行不应该出现。当我重新阅读它时,它听起来像是我在傲慢地说话。对此我感到抱歉。我并不是有意这样做的。我只是在书面交流方面很糟糕。 - David

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接