我有两个
COleDateTime
变量映射到对话框上的两个控件。
控件设置为短日期。
但是用户选择的日期仍然包含 MFC 内部的时间戳。
因此,当我测试变量是否相等时,它们失败了。
我知道我可以手动测试 3 个日期组件,但这会变得混乱。
给定 2 个
COleDateTime
对象,我们如何进行比较并忽略时间分量?
比如我想做这个测试:
(datMeeting >= m_sSetup.datStart && datWeek <= m_sSetup.datEnd)
但是开始/结束(映射到对话框)有时间组件,即使我不需要它们。
我只是想比较日期。
目前我正在这样做:
(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
在内部存储 DATE
值,可通过其 m_dt
公共成员访问。
A
DATE
数据类型是双精度浮点值,其中整数代表日期,小数部分代表一天中的时间。因此,去掉小数部分后,留下的值仅代表日期。将浮点值转换为整数值正是这样做的:
auto const meeting_date = static_cast<int>(datMeeting.m_dt);
auto const start_date = static_cast<int>(m_sSetup.datStart.m_dt);
auto const end_date = static_cast<int>(m_sSetup.datEnd.m_dt);
if (meeting_date >= start_date && meeting_date <= end_date) {
// ...
}
当然,编写自由函数没有什么错,例如,
bool is_date_in_range(COleDateTime date, COleDateTime start, COleDateTime end)
隐藏了复杂性并传达了有关意图的明确信息。