Compartilhar via


Data e hora

O MFC dá suporte a várias maneiras diferentes de trabalhar com datas e horários:

  • Suporte para o tipo de dados DATE de Automação. DATE dá suporte a valores de data, hora e data/hora. As classes COleDateTime e COleDateTimeSpan encapsulam essa funcionalidade. Eles trabalham com a classe COleVariant usando o suporte à Automação.

  • Classes de tempo de uso geral. As classes CTime e CTimeSpan encapsulam a maior parte da funcionalidade associada à biblioteca de horários padrão ANSI, declarada em time.h.

  • Suporte para o relógio do sistema. Com o MFC versão 3.0, o suporte foi adicionado para CTime para os tipos de dados SYSTEMTIME e FILETIME do Win32.

Data e hora: suporte à automação

A classe COleDateTime oferece uma maneira de representar informações de data e hora. Ela oferece granularidade mais fina e um intervalo maior que a classe CTime. A classe COleDateTimeSpan representa o tempo decorrido, como a diferença entre dois objetos COleDateTime.

As classes COleDateTime e COleDateTimeSpan são projetadas para uso com a classe COleVariant. COleDateTime e COleDateTimeSpan também são úteis na programação de banco de dados MFC, mas podem ser usados sempre que você quiser manipular valores de data e hora. Embora a classe COleDateTime tenha um intervalo maior de valores e granularidade mais fina do que a classe CTime, ela requer mais armazenamento por objeto do que CTime. Há também algumas considerações especiais ao trabalhar com o tipo DATE subjacente. Para obter mais informações sobre a implementação de DATE, consulte O tipo DATE.

Os objetos COleDateTime podem ser usados para representar datas entre 1º de janeiro de 100 e 31 de dezembro de 9999. Os objetos COleDateTime são valores de ponto flutuante, com uma resolução aproximada de 1 milissegundos. COleDateTime é baseado no tipo de dados DATE, definido na documentação do MFC em COleDateTime::operator DATE. A implementação real de DATE se estende além desses limites. A implementação COleDateTime impõe esses limites para facilitar o trabalho com a classe.

COleDateTime não dá suporte a datas julianas. Supõe-se que o calendário gregoriano se estenda no passado até 1º de janeiro de 100.

COleDateTime ignora o Horário de Verão (DST). O exemplo de código a seguir compara dois métodos de cálculo de um intervalo d tempo que cruza a data de substituição do DST: um usando o CRT e outro COleDateTime.

O primeiro método define dois objetos CTime, time1 e time2, para 5 e 6 de abril, respectivamente, usando as estruturas de tipo padrão C tm e time_t. O código mostra time1 e time2 o intervalo de tempo entre eles.

O segundo método cria dois objetos COleDateTime, oletime1 e oletime2, e os define como as mesmas datas time1 e time2. Ele mostra oletime1 e oletime2 e o intervalo de tempo entre eles.

O CRT calcula corretamente uma diferença de 23 horas. COleDateTimeSpan calcula a diferença de 24 horas.

void CDTDlg::OnPaint()
{
   CPaintDC dc(this); // device context for painting

   time_t date1_t, date2_t;
   tm date_tm;

   date_tm.tm_hour = 12;
   date_tm.tm_min = 0;
   date_tm.tm_mon = 3;
   date_tm.tm_sec = 0;
   date_tm.tm_wday = 0; //Day of week (0-6; Sunday = 0)
   date_tm.tm_yday = 0;
   date_tm.tm_year = 97;
   date_tm.tm_isdst = -1; //Positive if Daylight Saving Time is in effect;
                         //0 if Daylight Saving Time is not in effect; 
                         //Negative if status of DST is unknown.

   date_tm.tm_mday = 6;
   date2_t = mktime(&date_tm);

   date_tm.tm_mday = 5;
   date_tm.tm_isdst = 0;
   date1_t = mktime(&date_tm);

   CTime time1(date1_t), time2(date2_t);
   CTimeSpan ts = time2 - time1;

   dc.TextOut(0, 0, CString(_T("CTime")));
   dc.TextOut(0, 20, time1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 40, time2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 60, ts.Format(_T("%H:%M:%S and %D days")));


   COleDateTime oletime1(date1_t), oletime2(date2_t);
   COleDateTimeSpan olets = oletime2 - oletime1;

   dc.TextOut(0, 120, CString(_T("COleDateTime")));
   dc.TextOut(0, 140, oletime1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 160, oletime2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   
   //Work-around bug in COleDateTime::Format("%D")
   CString str;
   str.Format(_T("%s and %d days"), (LPCTSTR)olets.Format(_T("%H:%M:%S")), 
      olets.GetDays());
   dc.TextOut(0, 180, str);
}

Obter a hora atual

O procedimento a seguir mostra como criar um objeto COleDateTime e inicializá-lo com a hora atual.

Para obter a hora atual

  1. Crie um objeto COleDateTime.

  2. Chame GetCurrentTime.

    COleDateTime timeNow;
    timeNow = COleDateTime::GetCurrentTime();   
    

Calcular o tempo decorrido

Este procedimento mostra como calcular a diferença entre dois objetos COleDateTime e obter um resultado COleDateTimeSpan.

Para calcular o tempo decorrido

  1. Crie dois objetos COleDateTime.

  2. Defina um dos objetos COleDateTime como a hora atual.

  3. Execute uma tarefa demorada.

  4. Defina o outro objeto COleDateTime como a hora atual.

  5. Encontra a diferença entre duas vezes.

    COleDateTime timeStart, timeEnd;
    timeStart = COleDateTime::GetCurrentTime();
    // ... perform time-consuming task
    timeEnd = COleDateTime::GetCurrentTime();
    COleDateTimeSpan spanElapsed = timeEnd - timeStart;   
    

Formatar uma hora

Para formatar uma hora

Use a função membro Format de COleDateTime ou COleDateTimeSpan para criar uma cadeia de caracteres que represente o tempo ou o tempo decorrido.

COleDateTime time(1970, 12, 18, 17, 30, 0);
// 18 December 1970, 5:30 PM
CString s = time.Format(VAR_DATEVALUEONLY);
// s contains the date formatted based on 
// the current national language specifications
// (locale ID). The time portion is ignored for 
// formatting purposes in this case.   

Para obter mais informações, consulte a classe COleVariant.

Data e hora: suporte a banco de dados

A partir da versão 4.0, a programação de banco de dados MFC usa as classes COleDateTime e COleDateTimeSpan para representar dados de data e hora. Essas classes, também usadas na Automação, são derivadas da classe COleVariant. Eles oferecem melhor suporte para gerenciar dados de data e hora do que CTime e CTimeSpan.

Data e hora: Suporte a SYSTEMTIME

A classe COleDateTime tem construtores que aceitam horas do sistema e dos arquivos do Win32.

A estrutura FILETIME do Win32 representa o tempo como um valor de 64 bits. É um formato mais conveniente para armazenamento interno que a estrutura SYSTEMTIME e o formato usado pelo Win32 para representar o horário da criação do arquivo. Para obter informações sobre a estrutura SYSTEMTIME, confira SYSTEMTIME. Para obter informações sobre a estrutura FILETIME, confira FILETIME.

Confira também

Conceitos
Tópicos gerais do MFC