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

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

  • asctime() и _wasctime() — возвращают указатель на строку специального формата или нулевой указатель в случае ошибки. В конец строки вставляется символ перевода строки (\n) и нулевой символ (\0). Прототипы функций:
#include <ctime> /* или #include <time.h> */
char *asctime(const struct tm *Tm);
#include <ctime> /* или #include <cwchar> */
wchar_t *_wasctime(const struct tm *Tm);

Пример использования функции asctime():

tm Tm;
char *p = nullptr;
time_t t = std::time(nullptr);
errno_t err = localtime_s(&Tm, &t);
if (err) {
   std::cout << "Error" << std::endl;
   exit(1);
}
p = std::asctime(&Tm);
if (!p) {
   std::cout << "Error" << std::endl;
   std::exit(1);
}
std::cout << p; // Fri Apr 05 02:29:39 2019\n

Вместо функции asctime() лучше использовать функцию asctime_s(), а вместо функции _wasctime() — _wasctime_s(). Прототипы функций:

#include <ctime> /* или #include <time.h> */
errno_t asctime_s(char *buf, size_t sizeInBytes,
                  const struct tm *Tm);
#include <ctime> /* или #include <cwchar> */
errno_t _wasctime_s(wchar_t *buf, size_t sizeInWords,
                    const struct tm *Tm);

В первом параметре передается указатель на строку, во втором параметре — максимальный размер строки, а в третьем параметре — указатель на структуру tm. Если ошибок нет, то функции возвращают значение 0. При наличии ошибки возвращается значение макроса EINVAL (значение равно 22).

Пример использования функции asctime_s():

tm Tm;
const int SIZE = 80;
char str[SIZE] = {0};
time_t t = std::time(nullptr);
errno_t err = localtime_s(&Tm, &t);
if (err) {
   std::cout << "Error" << std::endl;
   exit(1);
}
err = asctime_s(str, SIZE, &Tm);
if (err) {
   std::cout << "Error" << std::endl;
   exit(1);
}
std::cout << str; // Fri Apr 05 02:41:07 2019\n
  • ctime(), _ctime64(), _wctime() и _wctime64() — функции аналогичны asctime(), но в качестве параметра принимают количество секунд, прошедших с начала эпохи. Прототипы функций:
#include <ctime> /* или #include <time.h> */
char *ctime(const time_t *Time);
char *_ctime64(const __time64_t *Time);
#include <ctime> /* или #include <cwchar> */
wchar_t *_wctime(const time_t *Time);
wchar_t *_wctime64(const __time64_t *Time);

Пример использования функции ctime():

char *p = nullptr;
time_t t = std::time(nullptr);
p = std::ctime(&t);
if (!p) {
   std::cout << "Error" << std::endl;
   exit(1);
}
std::cout << p; // Fri Apr 05 02:52:10 2019\n

Вместо этих функций лучше использовать функции ctime_s(), _ctime64_s() и _wctime64_s(). Прототипы функций:

#include <ctime> /* или #include <time.h> */
errno_t ctime_s(char *buf, size_t sizeInBytes,
                const time_t *Time);
errno_t _ctime64_s(char *buf, size_t sizeInBytes,
                   const __time64_t *Time);
#include <ctime> /* или #include <cwchar> */
errno_t _wctime64_s(wchar_t *buf, size_t sizeInWords,
                    const __time64_t *Time);

Если ошибок нет, то функции возвращают значение 0. При наличии ошибки возвращается значение макроса EINVAL. Пример использования функции ctime_s():

const int SIZE = 80;
char str[SIZE] = {0};
time_t t = std::time(nullptr);
errno_t err = ctime_s(str, SIZE, &t);
if (err) {
   std::cout << "Error" << std::endl;
   exit(1);
}
std::cout << str; // Fri Apr 05 03:03:21 2019\n
  • strftime() и wcsftime() — записывают строковое представление даты Tm в соответствии со строкой формата format в строку buf. Прототипы функций:
#include <ctime> /* или #include <time.h> */
size_t strftime(char *buf, size_t sizeInBytes,
                const char *format, const struct tm *Tm);
#include <ctime> /* или #include <cwchar> */
size_t wcsftime(wchar_t *buf, size_t sizeInWords,
                const wchar_t *format, const struct tm *Tm);

В первом параметре передается указатель на символьный массив, в который будет записан результат выполнения функции. Во втором параметре задается максимальный размер символьного массива. В параметре format указывается строка специального формата, а в последнем параметре передается указатель на структуру tm с представлением даты. Функции возвращают количество записанных символов. В случае ошибки возвращается значение 0 и переменная errno устанавливается равной EINVAL. Функции зависят от настроек локали.

В параметре format в функциях strftime() и wcsftime() помимо обычных символов могут быть указаны следующие комбинации специальных символов:

  • %y — год из двух цифр (от 00 до 99);
  • %Y — год из четырех цифр (например, 2019);
  • %m — номер месяца с предваряющим нулем (от 01 до 12);
  • %b — аббревиатура месяца в зависимости от настроек локали (например, сен в локали Russian_Russia.1251 или Sep в локали C для сентября);
  • %B — название месяца в зависимости от настроек локали (например, Сентябрь или September);
  • %d — номер дня в месяце с предваряющим нулем (от 01 до 31);
  • %j — день с начала года (от 001 до 366);
  • %U — номер недели в году (от 00 до 53). Неделя начинается с воскресенья;
  • %W — номер недели в году (от 00 до 53). Неделя начинается с понедельника;
  • %w — номер дня недели (0 — для воскресенья, 6 — для субботы);
  • %a — аббревиатура дня недели в зависимости от настроек локали (например, Ср или Wed для среды);
  • %A — название дня недели в зависимости от настроек локали (например, среда или Wednesday);
  • %H — часы в 24-часовом формате (от 00 до 23);
  • %I — часы в 12-часовом формате (от 01 до 12);
  • %M — минуты (от 00 до 59);
  • %S — секунды (от 00 до 59, изредка до 61);
  • %p — эквивалент значениям AM и PM в текущей локали;
  • %c — представление даты и времени в текущей локали (например, 05.04.2019 3:39:58 или 04/05/19 03:39:58);
  • %#c — расширенное представление даты и времени в текущей локали (например, 5 Апрель 2019 г. 3:41:06 или Friday, April 05, 2019 03:41:06);
  • %x — представление даты в текущей локали (например, 05.04.2019 или 04/05/19);
  • %#x — расширенное представление даты в текущей локали (например, 5 Апрель 2019 г. или Friday, April 05, 2019);
  • %X — представление времени в текущей локали (например, 07:29:44);
  • %Z — название часового пояса или пустая строка (например, RTZ 2 (зима));
  • %% — символ %.

Если после символа % указан символ # в комбинациях %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#W, %#y и %#Y, то предваряющие нули выводиться не будут. В качестве примера использования функции strftime() выведем текущую дату и время (листинг 11.2).

Листинг 11.2. Форматирование даты и времени

#include <iostream>
#include <clocale>
#include <ctime>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   tm Tm;
   const int SIZE = 100;
   char str[SIZE] = {0};
   time_t t = std::time(nullptr);
   errno_t err = localtime_s(&Tm, &t);
   if (err) {
      std::cout << "Error" << std::endl;
      return 1;
   }
   size_t count = std::strftime(str, SIZE,
                       "Сегодня:\n%A %d %b %Y %H:%M:%S\n%d.%m.%Y", &Tm);
   if (!count) {
      std::cout << "Error" << std::endl;
      return 1;
   }
   std::cout << str << std::endl;
   return 0;
}

Результат выполнения:

Сегодня:
пятница 05 апр 2019 03:30:20
05.04.2019

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов