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 classesCOleDateTime
eCOleDateTimeSpan
encapsulam essa funcionalidade. Eles trabalham com a classeCOleVariant
usando o suporte à Automação.Classes de tempo de uso geral. As classes
CTime
eCTimeSpan
encapsulam a maior parte da funcionalidade associada à biblioteca de horários padrão ANSI, declarada emtime.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 dadosSYSTEMTIME
eFILETIME
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
Crie um objeto
COleDateTime
.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
Crie dois objetos
COleDateTime
.Defina um dos objetos
COleDateTime
como a hora atual.Execute uma tarefa demorada.
Defina o outro objeto
COleDateTime
como a hora atual.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
.