如何忽略时间分量比较COleDateTime对象的日期部分?
忽略时间分量比较COleDateTime日期的更优方法
你当前逐个比较年月日的方法不仅代码冗余,还存在逻辑漏洞:比如当日期跨月时(比如datMeeting是2024-03-01,m_sSetup.datStart是2024-02-28),你的代码会因为1 >=28不成立,错误判断日期不满足>=条件,但实际前者日期更大。这里提供几种简洁且可靠的实现方式:
方法1:清零时间分量后直接比较
直接将两个COleDateTime对象的时间部分设为0(00:00:00),之后就可以用原生的比较运算符直接判断,逻辑和你原本需求完全一致:
// 复制原日期并清零时间 COleDateTime datMeetingDate = datMeeting; datMeetingDate.SetTime(0, 0, 0); COleDateTime datStartDate = m_sSetup.datStart; datStartDate.SetTime(0, 0, 0); COleDateTime datEndDate = m_sSetup.datEnd; datEndDate.SetTime(0, 0, 0); // 直接用比较运算符判断 bool isInRange = (datMeetingDate >= datStartDate && datMeetingDate <= datEndDate);
如果需要频繁使用,可以封装成一个工具函数:
COleDateTime GetDateOnly(const COleDateTime& dt) { COleDateTime result = dt; result.SetTime(0, 0, 0); return result; } // 调用时一行搞定 bool isInRange = (GetDateOnly(datMeeting) >= GetDateOnly(m_sSetup.datStart) && GetDateOnly(datMeeting) <= GetDateOnly(m_sSetup.datEnd));
方法2:利用DATE类型的特性截断时间
COleDateTime内部用DATE类型存储值,其中整数部分代表日期(从1899年12月30日开始的天数),小数部分代表时间。可以直接取整数部分来获取纯日期的数值,再转换为COleDateTime比较:
#include <cmath> // 需包含此头文件使用floor函数 // 截断时间部分,只保留日期的整数部分 DATE meetingDateOnly = floor(datMeeting); DATE startDateOnly = floor(m_sSetup.datStart); DATE endDateOnly = floor(m_sSetup.datEnd); bool isInRange = (meetingDateOnly >= startDateOnly && meetingDateOnly <= endDateOnly);
方法3:使用COleDateTime的Compare函数
如果只需要判断日期先后,也可以用Compare方法结合时间清零的思路,返回值为-1(小于)、0(等于)、1(大于):
COleDateTime meetingDate = GetDateOnly(datMeeting); COleDateTime startDate = GetDateOnly(m_sSetup.datStart); COleDateTime endDate = GetDateOnly(m_sSetup.datEnd); bool isInRange = (meetingDate.Compare(startDate) >= 0 && meetingDate.Compare(endDate) <= 0);
这几种方法都比逐个比较年月日更简洁易读,且能避免跨月跨年的判断错误。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

