UtcNow и Now - это одно и то же время?Они знают, что они разные? - PullRequest
5 голосов
/ 12 июля 2010

Если я запускаю фрагмент кода, например:

bool areTheyTheSame = DateTime.UtcNow == DateTime.Now

, что я получу?Знает ли возвращаемый DateTime свой часовой пояс, чтобы я мог его сравнить?

Моя конкретная проблема заключается в том, что я пытаюсь создать кеш-подобный API.Если требуется DateTime AbsoluteExpiration, должен ли я требовать, чтобы пользователи моего API знали, давать ли мне время UTC или время, основанное на часовом поясе?

[Редактировать] Этот вопрос SO очень важен для моей проблемыа также: Cache. Добавить абсолютный срок действия - на основе UTC или нет?

[Редактировать] Просто чтобы прояснить для будущих читателей, DateTimeKind - это то, что отличается.Неопределенный тип DateTimeKind часто представляет собой проблему, которую вы получаете, например, при извлечении одного из базы данных.Установите DateTimeKind в конструкторе DateTime ...

[Редактировать] JonSkeet написал прекрасный пост в блоге, осуждающий это поведение и предлагающий решение: http://noda -time.blogspot.co.uk / 2011 /08 / что-неправильно-с даты и времени-anyway.html

Ответы [ 3 ]

6 голосов
/ 12 июля 2010

Вы на самом деле пробовали фрагмент?

Они разные, и прямое сравнение не учитывает разницу, но вы можете преобразовать локальный код в UTC, позвонив по номеру ToUniversalTime.

var now = DateTime.Now;
var utcNow = DateTime.UtcNow;

Console.WriteLine(now);                         // 12/07/2010 16:44:16
Console.WriteLine(utcNow);                      // 12/07/2010 15:44:16
Console.WriteLine(now.ToUniversalTime());       // 12/07/2010 15:44:16
Console.WriteLine(utcNow.ToUniversalTime());    // 12/07/2010 15:44:16

Console.WriteLine(now == utcNow);                         // False
Console.WriteLine(now.ToUniversalTime() == utcNow);       // True
Console.WriteLine(utcNow.ToUniversalTime() == utcNow);    // True
2 голосов
/ 25 января 2011

Также будьте осторожны с местным DateTime и вызовом .ToUniversalTime(), когда наступит летнее время.

См. Примечание в разделе замечаний здесь: http://msdn.microsoft.com/en-us/library/system.timezone.touniversaltime.aspx

0 голосов
/ 29 июля 2010

DateTime.Now возвращает системное время, а DateTime.UtcNow возвращает время UTC.

...