Это хороший вопрос. Я возрождаю его, чтобы немного подробнее рассказать о том, как .Net ведет себя с разными Kind
значениями. Как указывает @Jan Zich, это на самом деле критически важное свойство, и оно устанавливается по-разному в зависимости от того, используете ли вы Now
или UtcNow
.
Внутри сохраняется дата, Ticks
которая (в отличие от ответа @Carl Camera) отличается в зависимости от того, используете ли вы Now
или UtcNow
.
DateTime.UtcNow
ведет себя как другие языки. Он устанавливает Ticks
значение на основе GMT. Это также устанавливает Kind
к Utc
.
DateTime.Now
изменяет Ticks
значение на то, что было бы, если бы это было ваше время суток в часовом поясе GMT . Это также устанавливает Kind
к Local
.
Если вы отстаете на 6 часов (GMT-6), вы получите время по Гринвичу 6 часов назад. .Net фактически игнорирует Kind
и обрабатывает это время так, как будто это было 6 часов назад, хотя это должно быть "сейчас". Это ломает еще больше, если вы создаете DateTime
экземпляр, затем меняете часовой пояс и пытаетесь его использовать.
Экземпляры DateTime с разными значениями «Kind» НЕ совместимы.
Давайте посмотрим на некоторый код ...
DateTime utc = DateTime.UtcNow;
DateTime now = DateTime.Now;
Debug.Log (utc + " " + utc.Kind); // 05/20/2015 17:19:27 Utc
Debug.Log (now + " " + now.Kind); // 05/20/2015 10:19:27 Local
Debug.Log (utc.Ticks); // 635677391678617830
Debug.Log (now.Ticks); // 635677139678617840
now = now.AddHours(1);
TimeSpan diff = utc - now;
Debug.Log (diff); // 05:59:59.9999990
Debug.Log (utc < now); // false
Debug.Log (utc == now); // false
Debug.Log (utc > now); // true
Debug.Log (utc.ToUniversalTime() < now.ToUniversalTime()); // true
Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() > now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() - now.ToUniversalTime()); // -01:00:00.0000010
Как вы можете видеть здесь, сравнения и математические функции не конвертируются автоматически в совместимое время. Значение Timespan
должно было составлять почти один час, но вместо этого было почти 6. «utc <now» должно было быть верным (я даже добавил час, чтобы быть уверенным), но все равно было ложным.
Вы также можете увидеть «обходной путь», который заключается в простом преобразовании в универсальное время в любом месте, Kind
которое не совпадает.
Мой прямой ответ на вопрос согласуется с рекомендацией принятого ответа о том, когда использовать каждый из них. Вы должны всегда пытаться работать с DateTime
объектами, которые имеют Kind=Utc
, кроме как во время ввода-вывода (отображение и анализ). Это означает, что вы должны почти всегда использовать DateTime.UtcNow
, за исключением случаев, когда вы создаете объект, просто чтобы отобразить его и сразу же отказаться от него.