Дата и время
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
объекта и oletime2
oletime1
задает их в те же даты, что 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
процедуре показано, как создать объект и инициализировать его с текущим временем.
Получение текущего времени
Создание объекта
COleDateTime
.Вызовите процедуру
GetCurrentTime
.COleDateTime timeNow; timeNow = COleDateTime::GetCurrentTime();
Вычисление истекшего времени
В этой процедуре показано, как вычислить разницу между двумя COleDateTime
объектами и получить COleDateTimeSpan
результат.
Вычисление истекшего времени
Создайте два
COleDateTime
объекта.Задайте для одного из
COleDateTime
объектов текущее время.Выполнение некоторой задачи, требующей много времени.
Задайте для другого
COleDateTime
объекта текущее время.Возьмите разницу между двумя разами.
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
.