Это хороший вопрос. Я возрождаю его, чтобы немного подробнее рассказать о том, как .Net ведет себя с различными значениями Kind
. Как отмечает @Jan Zich, это на самом деле критически важное свойство, и оно устанавливается по-разному в зависимости от того, используете ли вы Now
или UtcNow
.
Внутренне дата сохраняется как Ticks
, что (в отличие от ответа @Carl Camera) отличается в зависимости от того, используете ли вы Now
или UtcNow
.
DateTime.UtcNow
ведет себя как другие языки. Он устанавливает Ticks
на значение по Гринвичу. Он также устанавливает 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
Вы также можете увидеть «обходной путь», который заключается в простом преобразовании в универсальное время везде, где Kind
не совпадает.
Мой прямой ответ на вопрос согласуется с рекомендацией принятого ответа о том, когда использовать каждый из них. Вы всегда должны пытаться работать с DateTime
объектами, которые имеют Kind=Utc
, кроме как во время ввода-вывода (отображение и анализ). Это означает, что вы почти всегда должны использовать DateTime.UtcNow
, за исключением случаев, когда вы создаете объект, просто чтобы отобразить его и сразу отказаться от него.