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


Дата и время

MFC поддерживает несколько различных способов работы с датами и временем:

  • Поддержка типа данных службы автоматизации.DATE DATE поддерживает значения даты, времени и даты и времени. Эти COleDateTime функции инкапсулируются инкапсулируются COleDateTimeSpan в классах. Они работают с классом с помощью поддержки COleVariant службы автоматизации.

  • Классы времени общего назначения. Инкапсулирует CTime CTimeSpan большую часть функциональных возможностей, связанных с стандартной библиотекой времени ANSI, которая объявлена в time.h.

  • Поддержка системных часов. В MFC версии 3.0 добавлена CTime поддержка для типов данных Win32 и FILETIME Win32SYSTEMTIME.

Дата и время. Поддержка автоматизации

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

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

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

COleDateTime не поддерживает даты Джулиана. Григорианский календарь предполагается продлить назад до 1 января 100 года.

COleDateTime игнорирует время летнего времени (DST). В следующем примере кода сравниваются два метода вычисления интервала времени, пересекающего дату переключения DST: одну с помощью CRT, а другую — с помощью COleDateTime.

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

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

CRT правильно вычисляет разницу в 23 часах. COleDateTimeSpan вычисляет разницу в 24 часах.

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

Отображают текущее время

В следующей COleDateTime процедуре показано, как создать объект и инициализировать его с текущим временем.

Получение текущего времени

  1. Создание объекта COleDateTime.

  2. Вызовите процедуру GetCurrentTime.

    COleDateTime timeNow;
    timeNow = COleDateTime::GetCurrentTime();   
    

Вычисление истекшего времени

В этой процедуре показано, как вычислить разницу между двумя COleDateTime объектами и получить COleDateTimeSpan результат.

Вычисление истекшего времени

  1. Создайте два COleDateTime объекта.

  2. Задайте для одного из COleDateTime объектов текущее время.

  3. Выполнение некоторой задачи, требующей много времени.

  4. Задайте для другого COleDateTime объекта текущее время.

  5. Возьмите разницу между двумя разами.

    COleDateTime timeStart, timeEnd;
    timeStart = COleDateTime::GetCurrentTime();
    // ... perform time-consuming task
    timeEnd = COleDateTime::GetCurrentTime();
    COleDateTimeSpan spanElapsed = timeEnd - timeStart;   
    

Форматирование времени

Форматирование времени

Format Используйте функцию-член или COleDateTimeSpan COleDateTime создайте символьную строку, представляющую время или истекшее время.

COleDateTime time(1970, 12, 18, 17, 30, 0);
// 18 December 1970, 5:30 PM
CString s = time.Format(VAR_DATEVALUEONLY);
// s contains the date formatted based on 
// the current national language specifications
// (locale ID). The time portion is ignored for 
// formatting purposes in this case.   

Дополнительные сведения см. в описании класса COleVariant.

Дата и время. Поддержка базы данных

Начиная с версии 4.0 программирование базы данных MFC использует COleDateTime и COleDateTimeSpan классы для представления данных даты и времени. Эти классы, также используемые в службе автоматизации, являются производными от класса COleVariant. Они предоставляют лучшую поддержку для управления данными даты и времени, чем делатьCTime.CTimeSpan

Дата и время: SYSTEMTIME поддержка

Класс COleDateTime имеет конструкторы, принимаюющие время системы и файлов из Win32.

Структура Win32 FILETIME представляет время в виде 64-разрядного значения. Это более удобный формат для внутреннего хранилища, чем SYSTEMTIME структура, и формат, используемый Win32 для представления времени создания файла. Сведения о SYSTEMTIME структуре см. в разделе SYSTEMTIME. Сведения о FILETIME структуре см. в разделе FILETIME.

См. также

Основные понятия
Общие разделы по MFC