Tenho duas COleDateTime
variáveis mapeadas para dois controles em uma caixa de diálogo. Os controles são definidos como data abreviada . Porém, as datas selecionadas pelo usuário ainda incluem carimbos de data/hora internamente pelo MFC. Então, quando eu testo a igualdade das variáveis, elas falham.
Dados 2 COleDateTime
objetos, como podemos fazer comparação e ignorar o componente de tempo ? Por exemplo, quero fazer este teste:
(datMeeting >= m_sSetup.datStart && datWeek <= m_sSetup.datEnd)
Mas o Início / Fim (mapeado para a caixa de diálogo) possui componentes de tempo , embora eu não precise deles. Eu só quero comparar datas.
No momento estou fazendo assim:
(datMeeting.GetDay() >= m_sSetup.datStart.GetDay() &&
datMeeting.GetMonth() >= m_sSetup.datStart.GetMonth() &&
datMeeting.GetYear() >= m_sSetup.datStart.GetYear())
&&
(datMeeting.GetDay() <= m_sSetup.datEnd.GetDay() &&
datMeeting.GetMonth() <= m_sSetup.datEnd.GetMonth() &&
datMeeting.GetYear() <= m_sSetup.datEnd.GetYear())
COleDateTime
armazena internamente umDATE
valor, acessível através de seum_dt
membro público.Um
DATE
tipo de dados é um valor de ponto flutuante de precisão dupla, onde os números inteiros representam a data e a parte fracionária a hora do dia. Retirar a parte fracionária deixa assim um valor que representa apenas a data. Converter um valor de ponto flutuante em um valor inteiro faz exatamente isso:É claro que não há nada de errado em escrever uma função livre, por exemplo,
que esconde as complexidades e transmite uma mensagem clara sobre a intenção.
Observe que a expressão de comparação como você a possui agora possui um bug latente. Ele começará a se manifestar no início do próximo ano. Se
datMeeting
o ano de ' for estritamente maior quedatStart
o ano de ', seu mês e dia não deverão ser usados na comparação. Se forem, algumas datas são rejeitadas injustamente.A solução proposta acima é imune a esse defeito, pois opera em valores inteiros que possuem uma ordenação total estrita.