Partilhar via


Data e Hora

Observação

A biblioteca Microsoft Foundation Classes (MFC) e a Active Template Library (ATL) continuam a ser suportadas. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

O MFC suporta várias formas diferentes de trabalhar com datas e horários:

  • Suporte para o tipo de dados AutomaçãoDATE. DATE suporta valores de data, hora e data/hora. As COleDateTime classes e COleDateTimeSpan encapsulam esta funcionalidade. Eles trabalham com a COleVariant turma usando suporte de Automação.

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

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

Data e Hora: Suporte à Automação

A COleDateTime aula oferece uma forma de representar informações sobre data e hora. Proporciona uma granularidade mais fina e uma maior variedade do que a CTime classe. A COleDateTimeSpan classe representa o tempo decorrido, como a diferença entre dois COleDateTime objetos.

As COleDateTime classes e COleDateTimeSpan são concebidas para serem usadas com a COleVariant turma. COleDateTime e COleDateTimeSpan também são úteis na programação de bases de dados MFC, mas podem ser usadas sempre que quiser manipular valores de data e hora. Embora a COleDateTime classe tenha uma gama maior de valores e uma granularidade mais fina do que a CTime classe, requer mais armazenamento por objeto do que CTime. Existem também algumas considerações especiais ao trabalhar com o tipo DATE subjacente. Para mais informações sobre a implementação de DATE, veja O DATE Tipo.

COleDateTime os objetos podem ser usados para representar datas entre 1 de janeiro de 100 e 31 de dezembro de 9999. COleDateTime os objetos são valores de ponto flutuante, com uma resolução aproximada de 1 milissegundo. COleDateTime baseia-se no DATE tipo de dados, definido na documentação MFC sob COleDateTime::operator DATE. A implementação real de DATE vai além desses limites. A COleDateTime implementação impõe estes limites para facilitar o trabalho com a classe.

COleDateTime não apoia as datas Julian. Assume-se que o calendário gregoriano recua no tempo até 1 de janeiro de 100.

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

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

O segundo método cria dois COleDateTime objetos, oletime1 e oletime2, e define-os para as mesmas datas que time1 e time2. Mostra oletime1 e oletime2 e o intervalo de tempo entre eles.

O CRT calcula corretamente uma diferença de 23 horas. COleDateTimeSpan calcula uma 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);
}

Obtenha a hora atual

O procedimento seguinte mostra como criar um COleDateTime objeto e inicializá-lo com o tempo atual.

Para chegar à hora atual

  1. Crie um COleDateTime objeto.

  2. Ligue para o GetCurrentTime.

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

Calcular o tempo decorrido

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

Para calcular o tempo decorrido

  1. Cria dois COleDateTime objetos.

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

  3. Realiza uma tarefa que consume muito tempo.

  4. Define o outro COleDateTime objeto para a hora atual.

  5. Pegue na diferença entre as 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 Format função membro de um ou COleDateTimeCOleDateTimeSpan para criar uma cadeia de caracteres que represente o tempo ou 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 mais informações, veja a classe COleVariant.

Data e Hora: Suporte à Base de Dados

A partir da versão 4.0, a programação de bases de dados MFC utiliza as COleDateTime classes e COleDateTimeSpan para representar dados de data e hora. Estas classes, também usadas em Automação, derivam da classe COleVariant. Eles oferecem melhor suporte para gerir dados de data e hora do que o Do CTime e CTimeSpan.

Data e Hora: SYSTEMTIME Suporte

A COleDateTime classe tem construtores que aceitam tempos de sistema e ficheiros do Win32.

A estrutura Win32 FILETIME representa o tempo como um valor de 64 bits. É um formato mais conveniente para armazenamento interno do que uma SYSTEMTIME estrutura, e o formato usado pelo Win32 para representar o momento de criação do ficheiro. Para informações sobre a SYSTEMTIME estrutura, veja SYSTEMTIME. Para informações sobre a FILETIME estrutura, veja FILETIME.

Consulte também

Conceitos
Tópicos gerais do MFC