Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для Windows NT

© Александр Фролов, Григорий Фролов
Том 27, часть 2, М.: Диалог-МИФИ, 1996, 272 стр.

[Назад] [Содеожание] [Дальше]

Форматное преобразование даты и времени

В этом разделе мы рассмотрим две функции, предназначенные для получения текстовых строк времени и даты. Формат этих строк зависит от указанного идентификатора набора национальных параметров.

Преобразование времени

С помощью функции GetTimeFormat вы можете получить текстовую строку времени:


int GetTimeFormat(
  LCID    Locale,    // идентификатор набора параметров 
  DWORD   dwFlags,   // флаги режимов работы функции 
  CONST   SYSTEMTIME *lpTime, // время 
  LPCTSTR lpFormat,  // строка формата времени 
  LPTSTR  lpTimeStr, // буфер для полученной строки времени 
  int     cchTime);  // размер буфера в байтах 

Через параметр Locale вы должны передать функции GetTimeFormat идентификатор набора национальных параметров, для которого необходимо выполнить форматирование строки времени.

Параметр dwFlags определяет режимы работы функции. Для этого параметра вы можете указать следующие значения:

 Константа

 Описание

 LOCALE_NOUSEROVERRIDE

 Строка времени будет получена в формате, который используется операционной системой по умолчанию для данного идентификатора набора национальных параметров

 TIME_NOMINUTESORSECONDS

 Не использовать минуты или секунды

 TIME_NOSECONDS

 Не использовать секунды

 TIME_NOTIMEMARKER

 Не использовать маркер

 TIME_FORCE24HOURFORMAT

 Всегда использовать 24-часовой формат времени

Параметр lpTime может принимать значение NULL или содержать указатель на заполненную структуру типа SYSTEMTIME. В первом случае после завершения работы функции в буфере lpTimeStr будет получена строка для текущего времени. Во втором случае строка будет соответствовать времени, записанному в структуре SYSTEMTIME.

Приведем формат структуры SYSTEMTIME:


typedef struct _SYSTEMTIME 
{ 
  WORD wYear;         // год
  WORD wMonth;        // месяц (1 - январь, 2 - февраль 
                      // и так далее)
  WORD wDayOfWeek;    // день недели (0 - воскресение. 
                      // 1 - понедельник, и так далее)
  WORD wDay;          // день месяца
  WORD wHour;         // часы
  WORD wMinute;       // минуты
  WORD wSecond;       // секунды
  WORD wMilliseconds; // миллисекунды
} SYSTEMTIME;

Параметр lpFormat задает строку формата, в соответствии с которым будет отформатирована выходная строка.

Если этот параметр указан как NULL, будет использован стандартный формат, принятый для данного идентификатора набора национальных параметров, указанных функции GetTimeFormat в параметре Locale. В противном случае строка формата должна быть сформирована приложением.

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

 Символ

 Компонента времени

 h

 Часы без ведущего нуля в 12-часовом формате

 hh

 Часы с ведущим нулем в 12-часовом формате

 H

 Часы без ведущего нуля в 24-часовом формате

 HH

 Часы с ведущим нулем в 24-часовом формате

 m

 Минуты без ведущего нуля

 mm

 Минуты с ведущим нулем

 s

 Секунды без ведущего нуля

 ss

 Секунды с ведущим нулем

 t

 Маркер (такой как A или P)

 tt

 Многосимвольный маркер (такой как AM или PM)

Параметры lpTimeStr и cchTime указывают, соответственно, адрес и размер буфера, в который будет записана отформатированная строка. Если параметр cchTime равен нулю, функция GetTimeFormat вернет размер буфера, достаточный для записи полной выходной строки.

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


GetTimeFormat(GetThreadLocale(),
  LOCALE_NOUSEROVERRIDE, NULL, NULL, szBuf, 512);

Преобразование даты

Отформатированную в соответствии с указанным набором национальных параметров текстовую строку даты вы можете получить от функции GetDateFormat, во многом аналогичной только что рассмотренной функции GetTimeFormat.

Приведем прототип функции GetDateFormat:


int GetDateFormat(
  LCID    Locale,    // идентификатор набора параметров 
  DWORD   dwFlags,   // флаги режима работы функции 
  CONST   SYSTEMTIME *lpDate, // дата
  LPCTSTR lpFormat,  // строка формата даты 
  LPTSTR  lpDateStr, // буфер для записи выходной строки 
  int     cchDate);  // размер выходного буфера в байтах 

Рассмотрим отличия этой функции от функции GetTimeFormat.

Ниже мы привели набор констант, которые можно использовать для параметра dwFlags. Эти константы отличаются о тех, что можно использовать с функцией GetTimeFormat XE "GetTimeFormat" :

 Константа

 Описание

 LOCALE_NOUSEROVERRIDE

 Строка даты будет получена в формате, который используется операционной системой по умолчанию для данного идентификатора набора национальных параметров

 DATE_SHORTDATE

 Сокращенный формат даты

 DATE_LONGDATE

 Полный формат даты

 DATE_USE_ALT_CALENDAR

 Использование альтернативного календаря, если таковой определен для данного идентификатора набора национальных параметров

Отличаются также специальные символы, которые можно использовать в строке формата даты:

 Символ

 Компонента даты

 d

 День месяца без ведущего нуля

 dd

 День месяца с ведущим нулем

 ddd

 Трехбуквенное сокращение дня недели

 dddd

 Полное название дня недели

 M

 Номер месяца без ведущего нуля

 MM

 Номер месяца с ведущим нулем

 MMM

 Трехбуквенное сокращение названия месяца

 MMMM

 Полное название месяца

 y

 Двухзначное обозначение года без ведущего нуля (последние две цифры года)

 yy

 Двухзначное обозначение года с ведущим нулем

 yyyy

 Полный номер года

 gg

 Название периода или эры

Пример использования функции GetDateFormat для получения строки текущей даты приведен ниже:


GetDateFormat(GetThreadLocale(),
  LOCALE_NOUSEROVERRIDE | DATE_LONGDATE,
  NULL, NULL, szBuf1, 512);
[Назад] [Содеожание] [Дальше]