2012-04-20 4 views
9

Как приходят следующий код (в C#) возвращают ложь:DateTime.Ticks, DateTime.Equals и часовые пояса

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

Я бы ожидать, что клещи в DateTime быть в зависимости от времени UTC. На странице MSDN на DateTime.Ticks упоминает говорит

Значение этого свойства представляет количество 100-наносекундных интервалов, прошедших с 12:00:00 полночь, 1 января 0001, который представляет DateTime.MinValue. Он не включает количество тиков, которые относятся к скачкам секунд.

Полночь в январе, 0001 .. в каком часовом поясе?

Почему DateTime.Ticks зависит от времени?

Я думаю, что тот факт, что Клещи отличаются поэтому следующий код также возвращает ложь

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

MSDN от дока на DateTime.Equals упоминает

t1 и t2 равны, если их имущество Ticks значения равны. Их значения свойств Kind не рассматриваются в тесте на равенство.

Мое предположение было то, что DateTime.Ticks будет равным, независимо от часового пояса.

Я бы ожидал, что два момента времени будут равны независимо от того, в какой временной зоне они произошли. Неужели мои ожидания ошибочны?

+1

Обратите внимание, что вы можете использовать DateTimeOffset (http://msdn.microsoft.com/en-us/library/system.datetimeoffset.op_equality.aspx), который сравнивает момент времени при сравнении двух экземпляров. –

+0

@ChrisShaffer Спасибо, я думаю, что это то, что я должен использовать, так как то, что я ищу, это точные моменты времени, а не фактические «даты». – GuiSim

ответ

9

источник: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/fde7e5b0-e2b9-4d3b-8a63-c2ae75e316d8

DateTime.Ticks документирована как "число 100-наносекундных интервалов , прошедших с 12:00:00 полуночи 1 января 0001". То есть 1-янв-0001 по местному времени.Если вы преобразуете DateTime в UTC, Ticks будет затем числом 100-наносекундных интервалов, которые истекли с 12:00:00 полночь, 1 января 0001 UTC. Потенциально разные , что 1 января-0001 по местному времени, ergo два значения Ticks будут разных.

0

DateTime.Now определяется исходя из вашего смещения часового пояса, что означает, что он не будет таким же, как универсальное время, если ваше смещение равно нулю. Не было бы целесообразно преобразовать DateTime.Now в тики в двух разных часовых поясах и получить тот же результат - они являются одинаковым абсолютным временем (UTC), но не тем же относительным временем (с использованием смещения часового пояса).

1

Ваше текущее время (если вы не живете в одном конкретном часовом поясе - GMT) смещается от времени UTC на х часов, поэтому DateTime.Now может поставить вас в 4 часа ночи, а Datetime.Now.ToUniversalTime() может быть в 11:00 в зависимости от вашего текущего часового пояса.

отметок рассчитываются после перехода от часового пояса к универсальному времени, так что единственный раз, когда они должны быть равны, если вы проживаете в часовом GMT зоны.

Проще говоря, количество тиков между 01.01.2011 8:00 утра не совпадает с количеством тиков с 01.01.2011 11:00. В вашем коде дата преобразуется в универсальную дату, а затем галочки отображаются в правой части уравнения, но она просто использует вашу локальную дату, чтобы получить разницу слева, следовательно, они! = Каждый Другие.

+0

Я предполагаю, что два будут равны, потому что они представляют тот же самый момент времени. Я не ожидал, что изменение в системе отсчета изменит равенство. – GuiSim

+2

@GuiSim - Эта первая строка не должна была быть в моем ответе. Когда я перечитал его, это звучало так, будто я снисходителен. Извини за это. Я не хотел быть. Я просто ужасен в письменном сообщении. – David

Смежные вопросы