12

以下代码(在 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。它不包括可归因于闰秒的滴答数。

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

为什么 DateTime.Ticks 取决于时区?

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

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

DateTime.Equals上的 MSDN 文档提到

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

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

无论它们发生在哪个时区,我都希望两个时刻是相等的。我的期望错了吗?

4

3 回答 3

12

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

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

于 2012-04-20T18:59:52.343 回答
2

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

刻度是在从您的时区转换为世界时计算的,因此它们唯一应该相等的时间是您居住在 GMT 时区。

更简单地说,2011 年 1 月 1 日上午 8:00 之间的滴答数与 2011 年 1 月 1 日晚上 11:00 以来的滴答数不同。在您的代码中,日期被转换为通用日期,然后在等式的右侧计算刻度,但它只是使用您的本地日期来获取左侧的差异,因此,它们是 != each其他。

于 2012-04-20T18:59:09.097 回答
0

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

于 2012-04-20T18:58:55.727 回答