日期和时间:自动化支持

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

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);
}

请参见

概念

日期和时间