Data e hora: Suporte de automação
Este artigo descreve como aproveitar os serviços de biblioteca de classes relacionados até agora e de gerenciamento de tempo. Os procedimentos descritos incluem:
A classe de COleDateTime fornece uma maneira para representar as informações de data e hora. Fornece uma mais granularidade fina e um intervalo maior do que a classe de CTime . A classe de COleDateTimeSpan representa o tempo decorrido, como a diferença entre dois objetos de COleDateTime .
As classes de COleDateTime e de COleDateTimeSpan são projetadas para serem usadas com a classe de COleVariant usada na automação. COleDateTime e COleDateTimeSpan também são úteis na programação de banco de dados MFC, mas pode ser usado sempre que você deseja manipular a valores de data e hora. Embora a classe de COleDateTime tem um intervalo de valores e uma maior granularidade mais fina da classe de CTime , requer mais armazenamentos pelo objeto de CTime. Também há algumas considerações especiais ao trabalhar com o tipo subjacente de DATE . Consulte O tipo de DATA para mais detalhes sobre a implementação de DATE.
Os objetos deCOleDateTime podem ser usados para representar datas entre o 1º de janeiro, os 100, e 9999., o 31 de dezembro Os objetos deCOleDateTime são valores de ponto flutuante, com uma resolução aproximada de 1 milissegundos. COleDateTime é baseado no tipo de dados de DATE , definido na documentação MFC em DATA de COleDateTime::operator. A implementação real de DATE ultrapassa de esses limites. A implementação de COleDateTime aplicar esses limites para facilitar trabalhar com a classe.
COleDateTime não suporta datas julianas. O calendário gregoriano é assumido estender o tempo a volta para o 1º de janeiro, 100.
COleDateTime ignora o horário de verão (DST). O exemplo de código a seguir compara dois métodos de calcular um intervalo de tempo que intersecção a data de switchover de DST: um usando o CRT, e o outro COleDateTimedo. Opções de DST em, na maioria das localidades, na segunda semana em abril e. no terceiro em outubro
O primeiro método define dois objetos de CTime , time1 e time2, a o 5 de abril e respectivamente, o 6 de abril usando as estruturas tm e time_tctype do padrão. O código exibe time1 e time2 e o intervalo de tempo entre eles.
O segundo método cria dois objetos, oletime1 e oletime2de COleDateTime , e exibir as mesmas datas que time1 e time2. Exibe 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.
Observe que uma solução alternativa é usada pelo final de exemplo para exibir a data usando COleDateTime::Formatcorretamente. Consulte o artigo de Base de Dados de Conhecimento “INTRODUZIR ERROS DE FUNCIONAMENTO: O formato %D (“”) falha para COleDateTime e COleDateTimeSpan” (Q167338).
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);
}