Data e time: Suporte de automação
Este artigo descreve como usufruir as vantagens dos serviços de biblioteca de classes relacionados ao gerenciamento de data e time.Os procedimentos descritos incluem:
The COleDateTime classe fornece uma maneira de representar as informações de data e time.Ele fornece granularidade mais fina e um intervalo maior do que o CTime classe.The COleDateTimeSpan classe representa o time decorrido, tais sistema autônomo a diferença entre dois COleDateTime objetos.
The COleDateTime e COleDateTimeSpan classes são projetados para ser usado com o COleVariant classe usada na automação. COleDateTime e COleDateTimeSpan também são úteis na programação de banco de dados MFC, mas pode ser usados sempre que desejar manipular valores de data e time. Embora o COleDateTime classe tem uma variedade maior de valores e granularidade mais fina do que o CTime classe, ela requer mais armazenamento por objeto que não CTime. Também há algumas considerações especiais ao trabalhar com a base DATA tipo.See O tipo de data para obter mais detalhes sobre a implementação de DATA.
COleDateTime objetos podem ser usados para representar datas entre 1 de janeiro de 100 e 31 de dezembro de 9999. COleDateTime objetos são flutuante valores de ponto, com uma resolução aproximada de 1 milissegundo. COleDateTime se baseia o DATA tipo de dados de , definido na documentação do MFC em COleDateTime::operador DATE.A implementação real de DATA se estende além desses limites.The COleDateTime implementação impõe esses limites para facilitar o trabalho com a classe.
COleDateTime não dá suporte a datas do calendário juliano. Presume-se que o calendário gregoriano para estender novamente no time para 1 de janeiro de 100.
COleDateTime ignora o horário de verão (DST). O exemplo de código a seguir compara os dois métodos de cálculo de um intervalo de time que cruza a data de mudança do DST: um usando a CRT e a Outros usando COleDateTime. DST switches, na maioria das localidades, na segunda semana de abril e o terceiro de outubro.
O primeiro método define dois CTime objetos, tempo1 and hora2, 5 de abril e 6 de abril respectivamente, usando o tipo padrão C estruturas TM and time_t. O código exibe tempo1 and hora2 e o time variam entre eles.
O segundo método cria dois COleDateTime objetos, oletime1 e oletime2e define-sistema autônomo para sistema autônomo mesmas datas sistema autônomo tempo1 and hora2.Ele exibe oletime1 e oletime2 e o intervalo de time entre eles.
A CRT corretamente calcula uma diferença de 23 horas.COleDateTimeSpan Calcula a diferença de 24 horas.
Observe que uma solução alternativa é usada no participante do exemplo para exibir a data corretamente usando COleDateTime::Format. Consulte o artigo na Base de dados de Conhecimento "bug: Falha de Format("%D") paraCOleDateTime 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);
}