c# with Diferença entre System.DateTime.Now e System.DateTime.Today



datetime data type in c# (7)

Alguém pode explicar a diferença entre System.DateTime.Now e System.DateTime.Today em C # .NET? Prós e contras de cada um, se possível.


Answer #1

Eu pensei em adicionar esses links -

Voltando à pergunta original, usando o Reflector eu expliquei a diferença no código

 public static DateTime Today
    {
      get
      {
        return DateTime.Now.Date;   // It returns the date part of Now

        //Date Property
       // returns same date as this instance, and the time value set to 12:00:00 midnight (00:00:00) 
      }
    }


    private const long TicksPerMillisecond = 10000L;
    private const long TicksPerDay = 864000000000L;
    private const int MillisPerDay = 86400000;

    public DateTime Date
    {
       get
      {
        long internalTicks = this.InternalTicks; // Date this instance is converted to Ticks 
        return new DateTime((ulong) (internalTicks - internalTicks % 864000000000L) | this.InternalKind);  
// Modulo of TicksPerDay is subtracted - which brings the time to Midnight time 
      }
    }


     public static DateTime Now
        {
          get
          {
           /* this is why I guess Jon Skeet is recommending to use  UtcNow as you can see in one of the above comment*/
            DateTime utcNow = DateTime.UtcNow;


            /* After this i guess it is Timezone conversion */
            bool isAmbiguousLocalDst = false;
            long ticks1 = TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(utcNow, out isAmbiguousLocalDst).Ticks;
            long ticks2 = utcNow.Ticks + ticks1;
            if (ticks2 > 3155378975999999999L)
              return new DateTime(3155378975999999999L, DateTimeKind.Local);
            if (ticks2 < 0L)
              return new DateTime(0L, DateTimeKind.Local);
            else
              return new DateTime(ticks2, DateTimeKind.Local, isAmbiguousLocalDst);
          }
        }

Answer #2

DateTime.Now.ToShortDateString() exibirá apenas a parte da data


Answer #3

Tempo. .Agora inclui o 09:23:12 ou qualquer outra coisa; .Today é a parte de data apenas (às 00:00:00 daquele dia).

Então use. .Now se você quiser incluir o tempo, e. .Today se você quer apenas a data!

.Today é essencialmente o mesmo que .Now.Date


Answer #4

A propriedade DateTime.Now retorna a data e a hora atuais, por exemplo, 2011-07-01 10:09.45310 .

A propriedade DateTime.Today retorna a data atual com os compêndios de tempo definidos como zero, por exemplo, 2011-07-01 00:00.00000 .

A propriedade DateTime.Today , na verdade, é implementada para retornar DateTime.Now.Date :

public static DateTime Today {
  get {
    DateTime now = DateTime.Now;
    return now.Date;
  }
}

Answer #5

DateTime.Now retorna um valor DateTime que consiste na data e hora locais do computador em que o código está sendo executado. Tem DateTimeKind.Local atribuído à sua propriedade Kind . É equivalente a chamar qualquer um dos seguintes:

  • DateTime.UtcNow.ToLocalTime()
  • DateTimeOffset.UtcNow.LocalDateTime
  • DateTimeOffset.Now.LocalDateTime
  • TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local)
  • TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local)

DateTime.Today retorna um valor DateTime que possui os mesmos componentes de ano, mês e dia que qualquer uma das expressões acima, mas com os componentes de tempo definidos como zero. Ele também possui DateTimeKind.Local em sua propriedade Kind . É equivalente a qualquer um dos seguintes:

  • DateTime.Now.Date
  • DateTime.UtcNow.ToLocalTime().Date
  • DateTimeOffset.UtcNow.LocalDateTime.Date
  • DateTimeOffset.Now.LocalDateTime.Date
  • TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local).Date
  • TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local).Date

Observe que, internamente, o relógio do sistema é em termos de UTC, portanto, quando você chama DateTime.Now ele primeiro obtém a hora UTC (por meio da função GetSystemTimeAsFileTime na API do Win32) e, em seguida, converte o valor para o fuso horário local. (Portanto, DateTime.Now.ToUniversalTime() é mais caro que DateTime.UtcNow .)

Observe também que DateTimeOffset.Now.DateTime terá valores semelhantes a DateTime.Now , mas terá DateTimeKind.Unspecified vez de DateTimeKind.Local - o que pode levar a outros erros, dependendo do que você faz com ele.

Portanto, a resposta simples é que DateTime.Today é equivalente a DateTime.Now.Date .
Mas IMHO - Você não deve usar qualquer um desses ou qualquer um dos equivalentes acima.

Quando você solicita DateTime.Now , está solicitando o valor do relógio do calendário local do computador em que o código está sendo executado. Mas o que você recebe de volta não tem nenhuma informação sobre esse relógio! O melhor que você consegue é que DateTime.Now.Kind == DateTimeKind.Local . Mas de quem é o local? Essas informações se perdem assim que você faz qualquer coisa com o valor, como armazená-lo em um banco de dados, exibi-lo na tela ou transmiti-lo usando um serviço da web.

Se o fuso horário local seguir as regras de horário de verão, você não recuperará essas informações em DateTime.Now . Em tempos ambíguos, como durante uma transição "de retorno", você não saberá qual dos dois momentos possíveis corresponde ao valor recuperado com DateTime.Now . Por exemplo, digamos que o fuso horário do sistema esteja definido para o Mountain Time (US & Canada) e você solicite o DateTime.Now na madrugada de 3 de novembro de 2013. O que significa o resultado 2013-11-03 01:00:00 significa ? Há dois momentos de tempo instantâneo representados por esse mesmo datetime de calendário. Se eu fosse enviar esse valor para outra pessoa, eles não teriam ideia de qual deles eu queria dizer. Especialmente se eles estão em um fuso horário onde as regras são diferentes.

A melhor coisa que você poderia fazer seria usar DateTimeOffset :

// This will always be unambiguous.
DateTimeOffset now = DateTimeOffset.Now;

Agora, para o mesmo cenário descrito acima, recebo o valor 2013-11-03 01:00:00 -0600 antes da transição ou 2013-11-03 01:00:00 -0700 após a transição. Qualquer um que veja esses valores pode dizer o que eu quis dizer.

Eu escrevi um post sobre este assunto. Por favor, leia - O caso contra DateTime.Now .

Além disso, existem alguns lugares neste mundo (como o Brasil) onde a transição "primavera-para-frente" acontece exatamente à meia-noite. Os relógios vão de 23:59 a 01:00. Isso significa que o valor que você obtém para DateTime.Today em dia, não existe! Mesmo se você usar DateTimeOffset.Now.Date , você está obtendo o mesmo resultado, e você ainda tem esse problema. É porque, tradicionalmente, não existe um objeto Date em .Net. Assim, independentemente de como você obtém o valor, uma vez que você tira o tempo - você tem que lembrar que ele não representa realmente "meia-noite", mesmo que esse seja o valor com o qual você está trabalhando.

Se você realmente quiser uma solução totalmente correta para esse problema, a melhor abordagem é usar o NodaTime . A classe LocalDate representa adequadamente uma data sem hora. Você pode obter a data atual para qualquer fuso horário, incluindo o fuso horário do sistema local:

using NodaTime;
...

Instant now = SystemClock.Instance.Now;

DateTimeZone zone1 = DateTimeZoneProviders.Tzdb.GetSystemDefault();
LocalDate todayInTheSystemZone = now.InZone(zone1).Date;

DateTimeZone zone2 = DateTimeZoneProviders.Tzdb["America/New_York"];
LocalDate todayInTheOtherZone = now.InZone(zone2).Date;

Se você não quiser usar o Noda Time, agora há outra opção. Eu contribuí com uma implementação de um objeto somente de data para o projeto .Net CoreFX Lab . Você pode encontrar o objeto de pacote System.Time em seu feed MyGet. Uma vez adicionado ao seu projeto, você descobrirá que pode fazer o seguinte:

using System;
...

Date localDate = Date.Today;

Date utcDate = Date.UtcToday;

Date tzSpecificDate = Date.TodayInTimeZone(anyTimeZoneInfoObject);

Answer #6
DateTime dt = new DateTime();// gives 01/01/0001 12:00:00 AM
DateTime dt = DateTime.Now;// gives today date with current time
DateTime dt = DateTime.Today;// gives today date and 12:00:00 AM time

Answer #7

DateTime.Today representa a data atual do sistema com a parte do tempo definida como 00:00:00

e

DateTime.Now representa a data e hora do sistema atual





datetime