Fiquei me perguntando quais são exatamente os princípios de como as duas propriedades funcionam. Sei que o segundo é universal e basicamente não lida com fusos horários, mas alguém pode explicar em detalhes como eles funcionam e qual deve ser usado em que cenário?
.net
language-features
date
Slavo
fonte
fonte
Respostas:
DateTime.UtcNow informa a data e a hora como seria no Horário Universal Coordenado, também chamado de fuso horário médio de Greenwich - basicamente como seria se você estivesse em Londres na Inglaterra, mas não durante o verão. DateTime.Now fornece a data e a hora como apareceriam para alguém no seu local atual.
Eu recomendaria o uso
DateTime.Now
sempre que você exibir uma data para um ser humano - assim, eles se sintam confortáveis com o valor que vêem - é algo que eles podem comparar facilmente com o que vêem no relógio ou no relógio. UseDateTime.UtcNow
quando desejar armazenar datas ou utilizá-las para cálculos posteriores. Dessa forma (em um modelo cliente-servidor), seus cálculos não serão confundidos por clientes em fusos horários diferentes do servidor ou entre si.fonte
É realmente muito simples, então eu acho que depende do que é seu público e de onde ele mora.
Se você não usa Utc, deve conhecer o fuso horário da pessoa para a qual está exibindo datas e horários - caso contrário, você dirá que algo aconteceu às 15h no horário do sistema ou do servidor, quando realmente aconteceu às 17h onde eles vivem.
Usamos
DateTime.UtcNow
porque temos uma audiência global na Web e porque eu preferiria não incomodar todos os usuários para preencher um formulário indicando em que fuso horário eles moram.Também exibimos tempos relativos (2 horas atrás, 1 dia atrás, etc.) até a postagem envelhecer o suficiente para que o tempo seja "o mesmo", não importa onde você mora na Terra.
fonte
Observe também a diferença de desempenho;
DateTime.UtcNow
é cerca de 30 vezes mais rápidaDateTime.Now
, porque internamenteDateTime.Now
está fazendo muitos ajustes de fuso horário (você pode verificar isso facilmente com o Reflector).Portanto, NÃO use
DateTime.Now
para medições de tempo relativo.fonte
Um conceito principal de entender em .NET é que agora é agora toda a terra, não importa o fuso horário você está em Portanto, se você carregar uma variável com.
DateTime.Now
, OuDateTime.UtcNow
-. A atribuição é idêntica * O seuDateTime
objeto sabe o fuso horário você está em e leva isso em consideração, independentemente da atribuição.A utilidade disso
DateTime.UtcNow
é útil ao calcular datas nos limites do horário de verão. Ou seja, em locais que participam do horário de verão, às vezes há 25 horas do meio-dia ao meio-dia do dia seguinte e às vezes há 23 horas entre o meio-dia e o meio-dia do dia seguinte. Se você deseja determinar corretamente o número de horas entre o horário A e o horário B, primeiro é necessário converter cada um deles para seus equivalentes UTC antes de calcular oTimeSpan
.Isso é coberto por uma postagem de blog que escrevi que explica mais detalhadamente
TimeSpan
e inclui um link para um artigo da MS ainda mais extenso sobre o assunto.* Esclarecimento: Qualquer tarefa armazenará a hora atual. Se você fosse para carregar duas variáveis uma via
DateTime.Now()
e o outro viaDateTime.UtcNow()
aTimeSpan
diferença entre os dois seria milissegundos, não em horas supondo que você está em um fuso horário horas de distância de GMT. Conforme observado abaixo, a impressão de seusString
valores exibirá diferentes strings.fonte
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ê usarNow
ou nãoUtcNow
.Internamente, a data é armazenada como diferente
Ticks
(ao contrário da resposta da @Carl Camera), dependendo de você usarNow
ouUtcNow
.DateTime.UtcNow
comporta-se como outras línguas. Ele defineTicks
um valor baseado em GMT. Também defineKind
comoUtc
.DateTime.Now
altera oTicks
valor para o que seria se fosse a sua hora do dia no fuso horário GMT . Também defineKind
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 ...
Como você pode ver aqui, comparações e funções matemáticas não são convertidas automaticamente em horários compatíveis. o
Timespan
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 tenhamKind=Utc
, exceto durante a E / S (exibição e análise). Isso significa que você quase sempre deve estar usandoDateTime.UtcNow
, exceto nos casos em que está criando o objeto apenas para exibi-lo e descartá-lo imediatamente.fonte
DateTime não tem idéia de quais são os fusos horários. Sempre assume que você está no seu horário local. UtcNow significa apenas "Subtrair meu fuso horário do momento".
Se você deseja usar datas com reconhecimento de fuso horário, use DateTimeOffset , que representa uma data / hora com um fuso horário. Eu tive que aprender isso da maneira mais difícil.
fonte
A resposta "simples" para a pergunta é:
DateTime.Now retorna um valor DateTime que representa a hora atual do sistema (em qualquer fuso horário em que o sistema esteja sendo executado). A propriedade DateTime.Kind será DateTimeKind.Local
DateTime.UtcNow retorna um valor DateTime que representa o horário universal coordenado atual (também conhecido como UTC), que será o mesmo, independentemente do fuso horário do sistema. A propriedade DateTime.Kind será DateTimeKind.Utc
fonte
Apenas uma pequena adição aos pontos mencionados acima: a estrutura DateTime também contém um campo pouco conhecido chamado Kind (pelo menos, eu não sabia disso há muito tempo). É basicamente apenas uma bandeira indicando se a hora é local ou UTC; ele não especifica o deslocamento real do UTC para os horários locais. Além de indicar com quais intenções a estrutura foi construída, também influencia a maneira como os métodos ToUniversalTime () e ToLocalTime () funcionam.
fonte
Um pouco tarde para a festa, mas achei esses dois links (4guysfromrolla) muito úteis:
Usando o tempo universal coordenado (UTC) para armazenar valores de data / hora
Conselhos para armazenar e exibir datas e horas em diferentes fusos horários
fonte
DateTime.UtcNow é uma escala de tempo contínua e com valor único, enquanto DateTime.Now não é contínua ou com valor único. O principal motivo é o horário de verão, que não se aplica ao UTC. Portanto, o UTC nunca avança ou recua uma hora, enquanto o horário local (DateTime.Now) o faz. E quando salta para trás, o mesmo valor de tempo ocorre duas vezes.
fonte
DateTime.UtcNow é uma escala de horário universal que omite o horário de verão. Portanto, o UTC nunca muda devido ao horário de verão.
Mas, DateTime.Now não é contínuo ou de valor único porque é alterado de acordo com o horário de verão. O que significa DateTime.Now, o mesmo valor de tempo pode ocorrer duas vezes, deixando os clientes em um estado confuso.
fonte
Quando você precisar de um horário local para a máquina em que seu aplicativo é executado (como o CEST para a Europa), use Agora. Se você quer um tempo universal - UtcNow. É apenas uma questão de suas preferências - provavelmente criando um site local / aplicativo independente que você deseja usar o tempo que o usuário tem - tão afetado pela configuração de seu fuso horário - DateTime.Now.
Lembre-se, para um site, é a configuração de fuso horário do servidor. Portanto, se você estiver exibindo a hora para o usuário, obtenha o fuso horário preferido e mude a hora (basta salvar a hora Utc no banco de dados e modificá-la) ou especifique se é UTC. Se você esquecer de fazê-lo, o usuário poderá ver algo como: postou 3 min atrás e depois uma hora no futuro próximo :)
fonte
A grande diferença :) é que DateTime.Now não é suportado no SharePoint Workflow, você deve usar DateTime.UtcNow
fonte