日期和时间:自动化支持

本文介绍如何利用选件类库服务迄今相关的和时间线。 中介绍的过程包括:

COleDateTime 选件类提供了一种表示日期和时间信息。 它比 CTime 选件类提供更好的粒度和一个更大的范围。 COleDateTimeSpan 选件类表示时间,例如两 COleDateTime 对象之间的差异。

COleDateTimeCOleDateTimeSpan 选件类旨在使用自动化的 COleVariant 选件类。 COleDateTimeCOleDateTimeSpan 也很有用在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类型结构 tmtime_t,第一个方法分别设置两 CTime 对象,time1time2,对4月5日和4月6日。 代码演示 time1time2 和timespan在它们之间。

第二个方法创建两 COleDateTime 对象、 oletime1 和 oletime2,然后将它们对日期和 time1time2相同。 它显示 oletime1 和 oletime2 和timespan在它们之间。

CRT正确计算23小时差异。 COleDateTimeSpan 计算24小时差异。

请注意使用 COleDateTime::Format,工作区该示例快结束时使用正确显示该日期。 请参见知识库文章“BUG:格式(“%D”)表示 COleDateTimeCOleDateTimeSpan失败” (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);
}

请参见

概念

日期和时间