DateTime.Ticks, DateTime.Equals and timezones

本文关键字:DateTime timezones and Ticks Equals | 更新日期: 2023-09-27 18:31:45

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

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

我希望日期时间的刻度基于 UTC 时间。DateTime.Ticks上的MSDN页面提到说

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

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

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

我想 Tick 不同的事实是为什么下面的代码也返回 false

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

日期时间上的 MSDN 文档.等于提到

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

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

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

DateTime.Ticks, DateTime.Equals and timezones

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

DateTime.Ticks 被记录为"100 纳秒间隔数 自 0001 年 1 月 1 日午夜 12:00:00 以来已经过去了"。 那是 当地时间 0001 年 1 月 1 日。 如果将日期时间转换为 UTC,则 然后将是已用的 100 纳秒间隔数 自 0001 年 1 月 1 日午夜 12:00:00 UTC 起。 可能不同 当地时间 1-Jan-0001,因此两个 Ticks 值将是 不同。

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

即时报价是在从您的时区转换为世界时间计算的,因此如果您居住在格林威治标准时间时区,它们应该相等的唯一时间。

更简单地说,2011/1/1 8:00 AM 之间的即时报价数量与自 2011 年 1 月 1 日晚上 11:00 以来的即时报价数量不同。 在您的代码中,日期被转换为通用日期,然后在等式的右侧计算刻度,但它只是使用您的本地日期来获得左侧的差值,因此,它们是 != 彼此。

DateTime.Now

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