Поделиться через


Date and Time: Automation Support

В этой статье описывается, как использовать преимущества служб библиотеки классов, связанных с контролю даты и времени. Процедуры, описанные включают:

Класс COleDateTime предоставляет способ представления сведения о дате и времени. Она обеспечивает более точно гранулярность и большой диапазон, чем класс CTime. Класс COleDateTimeSpan представляет общее затраченное время, как разницу между объектами COleDateTime 2.

Классы COleDateTime и COleDateTimeSpan предназначены для использования с классом COleVariant, используемый в автоматизации. COleDateTime и COleDateTimeSpan также полезны при программировании баз данных MFC, но их можно использовать, когда нужно управлять значениями даты и времени. Хотя класс COleDateTime имеет большой диапазон значений и более четкие гранулярности, чем класс CTime, он требует большего хранения в объект меньше CTime. Также некоторые особые соображения при работе с базовым типом DATE. См. раздел тип ДАТЫ дополнительные сведения о реализации DATE.

Объекты COleDateTime может использоваться для представления даты между 1-ое января 100 и 31-ого декабря 9999. Объекты COleDateTime значения с плавающей запятой с приблизительным разрешением 1 миллисекунд. COleDateTime основано на типе данных DATE, указанном в документации по MFC в ДАТА COleDateTime::operator. Фактическая реализация DATE распространяется за этими границами. Реализация COleDateTime налагает эти границы для упрощения работы с классом.

COleDateTime не поддерживает юлианские даты. Предполагается, что расширяет григорианский календарь обратно в момент 1-ое января 100.

COleDateTime не пропускает летнее время. В следующем примере кода сравнивает 2 метода вычисления промежуток времени, который пересекает дату НЕ коммутации: одно использование CRT, а другой - с помощью COleDateTime. Переключатели НЕ переключается в большинстве языковых стандартах, в неделе в Эйприле второго и третьего в октябрь.

Первый метод устанавливает для объекта CTime 2, time1 и time2, 5-ое апреля и 6-ого апреля соответственно, используя стандартные структуры tm и time_t типа c. Примере кода показано, time1 и time2 и промежуток времени между ними.

Второй метод создает объекты, oletime1 2 и oletime2COleDateTime и устанавливает их к одним и тем же, как и дат time1 time2. Он указывает oletime1 и oletime2 и промежуток времени между ними.

Библиотека CRT правильно вычисляет разность 23 часов. Вычисляет разность COleDateTimeSpan 24 часов.

Обратите внимание, что решение используется в конце примера для правильного отображения даты с помощью COleDateTime::Format. См. в статье базы знаний ": ОШИБКА Отформатируйте ("%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);
}

См. также

Основные понятия

Date and Time