Это хороший вопрос. Я возрождаю его, чтобы немного подробнее рассказать о том, как .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, за исключением случаев, когда вы создаете объект, просто чтобы отобразить его и сразу же отказаться от него.