Essa é uma boa pergunta. Estou revivendo para dar um pouco mais de detalhes sobre como o .Net se comporta com Kind
valores diferentes . Como @Jan Zich salienta, é realmente uma propriedade extremamente importante e é definida de maneira diferente, dependendo de você usar Now
ou nãoUtcNow
.
Internamente, a data é armazenada como diferente Ticks
(ao contrário da resposta da @Carl Camera), dependendo de você usar Now
ouUtcNow
.
DateTime.UtcNow
comporta-se como outras línguas. Ele define Ticks
um valor baseado em GMT. Também define Kind
comoUtc
.
DateTime.Now
altera o Ticks
valor para o que seria se fosse a sua hora do dia no fuso horário GMT . Também define Kind
comoLocal
.
Se você estiver com seis horas de atraso (GMT-6), receberá o horário GMT de seis horas atrás. O .Net na verdade ignora Kind
e trata esse momento como se fosse 6 horas atrás, mesmo que devesse ser "agora". Isso quebra ainda mais se você criar umDateTime
instância, alterar seu fuso horário e tentar usá-lo.
Instâncias de DateTime com diferentes valores 'Kind' NÃO são compatíveis.
Vamos dar uma olhada em algum código ...
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
Como você pode ver aqui, comparações e funções matemáticas não são convertidas automaticamente em horários compatíveis. oTimespan
deveria ter sido quase uma hora, mas em vez disso era quase 6. "UTC <agora" deve ter sido verdade (eu mesmo adicionado uma hora para ter certeza), mas ainda era falsa.
Você também pode ver a 'solução alternativa', que é simplesmente converter para o tempo universal em qualquer lugar que Kind
não seja o mesmo.
Minha resposta direta à pergunta concorda com a recomendação da resposta aceita sobre quando usar cada uma. Você deveria sempre tentar trabalhar com DateTime
objetos que tenham Kind=Utc
, exceto durante a E / S (exibição e análise). Isso significa que você quase sempre deve estar usando DateTime.UtcNow
, exceto nos casos em que está criando o objeto apenas para exibi-lo e descartá-lo imediatamente.