日期和时间:自动化支持
本文介绍如何利用选件类库服务迄今相关的和时间线。 中介绍的过程包括:
COleDateTime 选件类提供了一种表示日期和时间信息。 它比 CTime 选件类提供更好的粒度和一个更大的范围。 COleDateTimeSpan 选件类表示时间,例如两 COleDateTime 对象之间的差异。
COleDateTime 和 COleDateTimeSpan 选件类旨在使用自动化的 COleVariant 选件类。 COleDateTime 和 COleDateTimeSpan 也很有用在MFC编程的数据库,但是,可以使用它们,只要要操作日期和时间值。 虽然 COleDateTime 选件类比 CTime 选件类具有值和更好的粒度的一个更大的范围,所以它比 CTime需要更多存储每个对象。 当与基础 DATE 类型时,还有一些特殊注意事项。 有关更多详细信息参见 日期类型 在 DATE的实现。
COleDateTime 对象可用来表示在31年一月1日,100和9999之间的日期,十二月。 COleDateTime 对象是浮点值,与1毫秒的近似解析。 COleDateTime 基于 DATE 数据类型,在 COleDateTime::operator DATE下的MFC文档。 DATE 的实际实现这些这样的限制。 COleDateTime 实现对这些区域便于与选件类一起使用。
COleDateTime 不支持朱利安日期。 公历假定实时扩展为" 100年一月1日。
COleDateTime 忽略夏时制(DST)。 下面的代码示例比较计算跨DST将日期时间范围的两个方法:一个使用CRT和其他使用 COleDateTime。 DST开关,在大多数区域设置,第二周中4月和第三的在十月。
通过标准C类型结构 tm 和 time_t,第一个方法分别设置两 CTime 对象,time1 和 time2,对4月5日和4月6日。 代码演示 time1 和 time2 和timespan在它们之间。
第二个方法创建两 COleDateTime 对象、 oletime1 和 oletime2,然后将它们对日期和 time1 和 time2相同。 它显示 oletime1 和 oletime2 和timespan在它们之间。
CRT正确计算23小时差异。 COleDateTimeSpan 计算24小时差异。
请注意使用 COleDateTime::Format,工作区该示例快结束时使用正确显示该日期。 请参见知识库文章“BUG:格式(“%D”)表示 COleDateTime 和 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);
}